Encontrar la ubicación actual del usuario en Android

Soy nuevo en Android y estoy tratando de desarrollar una aplicación para Android que muestre la ubicación actual del usuario. Estoy usando Genymotion. Ahora estoy usando

mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient); 

para obtener la última ubicación del dispositivo. La cuestión es que quería obtener la ubicación actual, pero con esto obtengo una mlocation no nula, está bien. Pero en el mapa muestra la última ubicación del dispositivo, no siempre la ubicación actual.

fragmento de código

 @Override public void onConnected(Bundle bundle) { Log.i(TAG, "inside onconnected Location services connected"); Location mLocation=null; mLocationRequest= new LocationRequest(); mLocationRequest.setInterval(10 * 1000) ; mLocationRequest.setFastestInterval(1 * 1000);mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { } mLocation=LocationServices.FusedLocationApi.getLastLocation(mGoogleClient); if(mLocation==null) { Log.d("***Inside mlocation***", "***mlocation is null here"); } if (mLocation != null) { onLocationChanged(mLocation); } LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleClient, mLocationRequest, this); } @Override public void onLocationChanged(Location location) { double currentLatitude = location.getLatitude(); double currentLongitude = location.getLongitude(); LatLng latLng = new LatLng(currentLatitude,currentLongitude); MarkerOptions options = new MarkerOptions() .position(latLng) .title("Im here!"); mMap.addMarker(options); mMap.moveCamera(CameraUpdateFactory.newLatLng(latLng)); } 

y en onstart() llamé a googleapi.connect() y usé setUpMapIfNeeded() apropiadamente.

Por favor dime cuál es el problema en este código. Estoy intentando esto por 3 días.

publicando una solución simple con código.

agregar permisos dentro del archivo AndroidManifest.xml

   

si su aplicación es compatible con malvavisco, verifique el permiso de tiempo de ejecución.

agregar dependencia dentro de archivo gradle:

 compile 'com.google.android.gms:play-services:9.2.0' 

implementa esta interfaz en tu actividad

 GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener 

y

crea un objeto googleapiclient como este en oncreate:

 mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); 

y hacer esto en la actividad de inicio

 mGoogleApiClient.connect(); 

aquí vamos a la callback de resultados en este método de anulación.

 public void onConnected(@Nullable Bundle bundle) { Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation != null) { Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude())); } else { Toast.makeText(getApplicationContext(), "Your Location Not Found", Toast.LENGTH_LONG).show(); } } 

el código completo de actividad es algo así:

 public class LocationActivity extends AppCompatActivity implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener { private static final String TAG = LocationActivity.class.getSimpleName(); private GoogleApiClient mGoogleApiClient; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_location); // Create an instance of GoogleAPIClient. if (mGoogleApiClient == null) { mGoogleApiClient = new GoogleApiClient.Builder(this) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); } } @Override protected void onStart() { // connect googleapiclient mGoogleApiClient.connect(); super.onStart(); } @Override protected void onStop() { // disconnect googleapiclient mGoogleApiClient.disconnect(); super.onStop(); } @Override public void onConnected(@Nullable Bundle bundle) { Location mLastLocation = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if (mLastLocation != null) { // here we go you can see current lat long. Log.e(TAG, "onConnected: " + String.valueOf(mLastLocation.getLatitude()) + ":" + String.valueOf(mLastLocation.getLongitude())); } } @Override public void onConnectionSuspended(int i) { } @Override public void onConnectionFailed(@NonNull ConnectionResult connectionResult) { }} 

ps googleapiclient no funciona en el emulador sin servicios de reproducción, por lo que debe probarlo en dispositivos reales. por favor, asegúrese de que gps esté habilitado en ese dispositivo.

si quieres usar el método tradicional para obtener ubicación, prueba este tutorial. http://www.androidhive.info/2012/07/android-gps-location-manager-tutorial/

—— ACTUALIZAR EL 15 DE JUNIO ———

para la última versión de apis check android google post: https://android-developers.googleblog.com/2017/06/reduce-friction-with-new-location-apis.html

Para Map Service, requiere Google Play Services. Asegúrese de que su Genymotion tiene PlayService instalado si no Obtenga una ayuda de aquí para instalar Google Play Servies en Genymotion. Happy Coding … !!!

  LocationListener locationListener; LocationManager locationManager; double latitude; double longitude; locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE); locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { longitude = location.getLongitude(); latitude = location.getLatitude(); } @Override public void onStatusChanged(String provider, int status, Bundle extras) { } @Override public void onProviderEnabled(String provider) { } @Override public void onProviderDisabled(String provider) { } }; if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // TODO: Consider calling // ActivityCompat#requestPermissions // here to request the missing permissions, and then overriding // public void onRequestPermissionsResult(int requestCode, String[] permissions, // int[] grantResults) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. ; } locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,1000, 0, locationListener); Log.e("location", longitude + " " + latitude);