FusedLocationApi.getLastLocation siempre null

Me gustaría simplemente recuperar la ubicación del dispositivo en mi proyecto de Android y para ello utilizo el método play-services:

protected synchronized void buildGoogleApiClient() { mGoogleApiClient = new GoogleApiClient.Builder( MainSearchActivity.this ) .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected( Bundle bundle ){ Location location = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if( location == null ){ LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, new LocationListener() { @Override public void onLocationChanged(Location location) { lastLocation = location; } }); } } @Override public void onConnectionSuspended( int i ){ } }) .addOnConnectionFailedListener(new GoogleApiClient.OnConnectionFailedListener() { @Override public void onConnectionFailed( ConnectionResult connectionResult ){ if( connectionResult.hasResolution() ){ try { // Start an Activity that tries to resolve the error connectionResult.startResolutionForResult(MainSearchActivity.this, CONNECTION_FAILURE_RESOLUTION_REQUEST); }catch( IntentSender.SendIntentException e ){ e.printStackTrace(); } }else{ Utils.logger("Location services connection failed with code " + connectionResult.getErrorCode(), Utils.LOG_DEBUG ); } } }) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } public Location retrieveLastLocation(){ Location loc = LocationServices.FusedLocationApi.getLastLocation(mGoogleApiClient); if( loc == null) { } return loc; //TODO: What if loc is null? } 

Pero la variable loc es SIEMPRE nula. Es como tal en diferentes teléfonos, cada vez. También lastLocation, que intento asignar en el onLocationChanged, nunca cambia. Siempre nulo.

Estos son los permisos que establezco para la aplicación.

  <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="com.vogella.android.locationapi.maps.permission.MAPS_RECEIVE" /> <uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES" /> 

Simplemente no lo entiendo: ¿por qué los LocationServices no pueden recuperar una posición? Tengo todos los ajustes de la geolocalización permitidos en los tres el deviced i probado sobre: ​​- /

Gracias por cualquier ayuda

El Location Provider fusionado sólo mantendrá la ubicación de fondo si al menos un cliente está conectado a ella. Ahora solo activar el servicio de ubicación no garantiza almacenar la última ubicación conocida.

Una vez que el primer cliente se conecta, inmediatamente intentará obtener una ubicación. Si su actividad es el primer cliente que se conecta y getLastLocation() se invoca de inmediato en onConnected() , puede que no sea suficiente tiempo para que llegue la primera ubicación.

Te sugiero que inicies primero la aplicación de Google Maps, de modo que haya al menos alguna ubicación confirmada y luego prueba tu aplicación.

Creo que hay una pequeña falta que no es visible para mí en el código mostrado.

El mGoogleApiClient está construido pero parece no estar conectado. Puede verificar esto llamando a mGoogleApiClient.isConnected() .

Sólo puede anular el método onStart y llamar a conectar allí. O puede sobrescribir onResume() en caso de que desee acceder a la ubicación siempre que su actividad sea visible.

  @Override protected void onStart() { super.onStart(); if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } } 

Primero, cree un objeto LocationRequest :

  // Create the LocationRequest object mLocationRequest = LocationRequest.create() .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY) .setInterval(10 * 1000) // 10 seconds, in milliseconds .setFastestInterval(1 * 1000); // 1 second, in milliseconds 

A continuación, asegúrese de que el usuario ha concedido permiso para utilizar la ubicación. Si es así, obtenga la ubicación de requestLocationUpdates siguiente manera:

 void getLocation() { Location location = null; if (ContextCompat.checkSelfPermission(activity, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(activity, new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, 1); /*TODO!! INSERT CODE TO PROMPT USER TO GIVE PERMISSION*/ } else { LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest, this); } mLastLocation = location; LocationServices.FusedLocationApi.removeLocationUpdates(mGoogleApiClient,this); } 

Asegúrese de eliminar las actualizaciones si sólo necesita una ubicación sin monitoreo constante. De esta manera, nunca obtendrá una Location nula.

Para obtener más información, vaya a http://blog.teamtreehouse.com/beginners-guide-location-android .

Si getLastLocation () siempre está devolviendo null, pruebe este hack. Lo he usado para resolver mi problema. Implementar LocationListener (import com.google.android.gms.location.LocationListener) en su actividad.

 protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); Context mContext = this; manager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); createLocationRequest(); mGoogleApiClient = new GoogleApiClient.Builder(mContext) .addConnectionCallbacks(this) .addOnConnectionFailedListener(this) .addApi(LocationServices.API) .build(); mGoogleApiClient.connect(); } private void createLocationRequest(){ mLocationRequest = LocationRequest.create(); mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); mLocationRequest.setInterval(SET_INTERVAL); mLocationRequest.setFastestInterval(FASTEST_INTERVAL); } 

OnStart o onResume (i preferred onResume)

 @Override protected void onResume() { super.onResume(); if (manager.isProviderEnabled(LocationManager.GPS_PROVIDER) ) { if (mGoogleApiClient != null) { mGoogleApiClient.connect(); } }else{ // Showyourmesg(); } } @Override protected void onPause() { super.onPause(); if (mGoogleApiClient != null) { mGoogleApiClient.disconnect(); } } protected void startLocationUpdates(){ LocationServices.FusedLocationApi.requestLocationUpdates(mGoogleApiClient, mLocationRequest,this); } protected void stopLocationUpdates() { LocationServices.FusedLocationApi.removeLocationUpdates( mGoogleApiClient, this); } 

Ahora, en su método onLocationChanged compruebe si el googleApiClient está conectado o no. Si está conectado, desconéctelo y vuelva a conectarse.

 @Override public void onLocationChanged(Location location) { Log.d("SplashAct", "LocatinChngListner, loc: " + location.getLatitude() + "," + location.getLongitude()); if (mGoogleApiClient != null) if (mGoogleApiClient.isConnected() || mGoogleApiClient.isConnecting()){ mGoogleApiClient.disconnect(); mGoogleApiClient.connect(); } else if (!mGoogleApiClient.isConnected()){ mGoogleApiClient.connect(); } } 

Y finalmente, en su método onConntected ()

 @Override public void onConnected(Bundle bundle) { Log.d("ACTIVITY", "ApiClient: OnConnected"); mLastLocation = LocationServices.FusedLocationApi.getLastLocation( mGoogleApiClient); if (mLastLocation == null){ startLocationUpdates(); // bind interface if your are not getting the lastlocation. or bind as per your requirement. } if (mLastLocation != null){ while (latitude == 0 || longitude == 0){ pDialog.setMessage("Getting Location"); pDialog.show(); latitude = mLastLocation.getLatitude(); longitude = mLastLocation.getLongitude(); if (latitude != 0 && longitude != 0){ stopLocationUpdates(); // unbind the locationlistner here or wherever you want as per your requirement. pDialog.dismiss(); // location data received, dismiss dialog, call your method or perform your task. } } } } 

Estamos tratando de conectar repetidamente a googleApiClient, incluso si ya está conectado, para que podamos obtener los datos lastLocation. Esto dependerá de los intervalos LocationRequest. También puede obtener los datos de ubicación en onLocationChanged y realizar su tarea desde allí.

Si está usando Android Marshmallow (API 23) o una versión más reciente de Android, puede enfrentar el mismo problema porque no se concede permiso . Debe solicitar permiso explícitamente en tiempo de ejecución para la ubicación o, si se trata de un proyecto de prueba, puede otorgar permiso de ubicación a partir de la configuración de la aplicación en su teléfono.

Aquí está la respuesta exacta y la explicación.

LocationClient getLastLocation () return null

Esto está relacionado con la respuesta de Amit K. Saha, pero para mí, en uno de mis dispositivos de Lollipop me quedé null . Así que abrí la aplicación mapas y tengo la pantalla de abajo me pide que encienda todo ese jazz para mejorar mi ubicación.

Una vez que lo hice una vez, mi dispositivo fue capaz de recibir la ubicación con sólo una llamada a getLastLocation() ;

Supongo que uno tendría que pedir estos permisos en la instalación de la aplicación para los usuarios que pueden no haber utilizado su aplicación de mapas todavía.

Introduzca aquí la descripción de la imagen

  • Cómo falsificar la ubicación para hacer pruebas con LocationClient y Geofences en Android?
  • Cálculo de distancia desde mi ubicación hasta la ubicación de destino en android
  • FusedLocationProviderApi.KEY_LOCATION_CHANGED obsoleta. ¿Qué hacer ahora?
  • Cambio de idioma dentro de la aplicación Android
  • Se pierde el proveedor de Android Fused Location
  • Emulador de Android se reinicia cuando se envía una ubicación falsa
  • ADB Shell obtiene la ubicación GPS en vivo (no la última ubicación conocida)
  • Actualizaciones de ubicación de Android en un servicio
  • Ubicación Actualización en función del estado del dispositivo
  • ¿Cómo afecta la función Doze / Standby a las actualizaciones de ubicación?
  • Permisos de aplicaciones en Android Marshmallow en PhoneGap
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.