LocationClient no conectado en el método "onConnected"

¿Alguien ha tenido ya este problema: – Estoy inicializando un LocationClient, con ConnectionCallbacks y así sucesivamente … – Entonces, llamo "connect ()" en él. – En mi método "onConnected", llamo myLocationClient.getLastLocation (), lo que hace que la aplicación se bloquee en algunos dispositivos de personas, con la excepción:

"Excepción Fatal: java.lang.IllegalStateException No está conectado. Llame a connect () y espere a que onConnected () sea llamado."

¿Alguna idea?

He aquí una parte del código:

myLocationClient = new LocationClient(this, new ConnectionCallbacks() { @Override public void onDisconnected() { //Do some stuff here } @Override public void onConnected(Bundle arg0) { if(myLocationClient.getLastLocation() != null) { //Do some other stuff here } } }, new OnConnectionFailedListener() { @Override public void onConnectionFailed(ConnectionResult arg0) { //Do other stuff here } }); myLocationClient.connect(); 

La aplicación se bloquea en la primera línea del método "onConnected".

Para las personas que quieren la pila aquí es:

 java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called. at com.google.android.gms.internal.kB() at com.google.android.gms.internal.bh.a() at com.google.android.gms.internal.bh$cB() at com.google.android.gms.internal.bg.getLastLocation() at com.google.android.gms.internal.bh.getLastLocation() at com.google.android.gms.location.LocationClient.getLastLocation() at com.myAppPackage.onConnected(AroundMeActivity.java:321) at com.google.android.gms.internal.ky() at com.google.android.gms.internal.k$fa() at com.google.android.gms.internal.k$fa() at com.google.android.gms.internal.k$bD() at com.google.android.gms.internal.k$a.handleMessage() at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at android.app.ActivityThread.main(ActivityThread.java:5419) at java.lang.reflect.Method.invokeNative(Method.java) at java.lang.reflect.Method.invoke(Method.java:525) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1209) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1025) at dalvik.system.NativeStart.main(NativeStart.java) 

La locationClient.getLastLocation() obtiene la última ubicación conocida del cliente. Sin embargo, el proveedor de ubicación fusionado sólo mantendrá la ubicación de fondo si al menos un cliente está conectado a él. 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 llama a getLastLocation() inmediatamente en onConnected() , puede que no sea suficiente tiempo para que llegue la primera ubicación. Esto resultará en que la ubicación sea null.

Para resolver este problema, tienes que esperar (indeterminadamente) hasta que el proveedor obtiene la ubicación y luego llamar a getLastLocation() , lo cual es imposible saber.
Otra opción (mejor) es implementar la interfaz com.google.android.gms.location.LocationListener para recibir actualizaciones periódicas de ubicación (y desactivarla una vez que obtenga la primera actualización).

 public class MyActivity extends Activity implements ConnectionCallbacks, OnConnectionFailedListener, LocationListener { // . . . . . . . . more stuff here LocationRequest locationRequest; LocationClient locationClient; @Override protected void onCreate(Bundle savedInstanceState) { // . . . . other initialization code locationClient = new LocationClient(this, this, this); locationRequest = new LocationRequest(); // Use high accuracy locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY); // Set the update interval to 5 seconds locationRequest.setInterval(UPDATE_INTERVAL); // Set the fastest update interval to 1 second locationRequest.setFastestInterval(FASTEST_INTERVAL); } // . . . . . . . . other methods @Override public void onConnected(Bundle bundle) { Location location = locationClient.getLastLocation(); if (location == null) locationClient.requestLocationUpdates(locationRequest, this); else Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show(); } // . . . . . . . . other methods @Override public void onLocationChanged(Location location) { locationClient.removeLocationUpdates(this); // Use the location here!!! } 

En este código, está comprobando si el cliente ya tiene la última ubicación (en onConnected). De lo contrario, está solicitando actualizaciones de ubicación y desactivando las solicitudes (en la devolución de llamada onLocationChanged() ) tan pronto como reciba una actualización .

ACTUALIZAR:

Muchas veces, el usuario tendría servicios de localización deshabilitados (para ahorrar batería, o motivos de privacidad). En tal caso, el código anterior seguirá solicitando actualizaciones de ubicación, pero onLocationChanged nunca se llamará. Puede detener las solicitudes comprobando si el usuario ha inhabilitado los servicios de ubicación.

Si su aplicación requiere que habilite los servicios de ubicación, desea mostrar un mensaje o un brindis. Lamentablemente, no hay forma de comprobar si el usuario ha deshabilitado los servicios de ubicación en la API de servicios de ubicación de Google. Para ello, tendrá que recurrir a la API de Android.

En su método onCreate:

 LocationManager manager = (LocationManager) getActivity().getSystemService(Context.LOCATION_SERVICE); if (!manager.isProviderEnabled(LocationManager.GPS_PROVIDER) && !manager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { locationEnabled = false; Toast.makeText(getActivity(), "Enable location services for accurate data", Toast.LENGTH_SHORT).show(); } else locationEnabled = true; 

Y usa el flag locationEnabled en tu método onConnected como este:

 if (location != null) { Toast.makeText(getActivity(), "Location: " + location.getLatitude() + ", " + location.getLongitude(), Toast.LENGTH_SHORT).show(); } else if (location == null && locationEnabled) { locationClient.requestLocationUpdates(locationRequest, this); } 

Un agradecimiento especial a Rahul Jiresal.

  • ¿Cómo mostrar pop-up al hacer clic en la superposición de mapa?
  • Marcadores del centro API V2 de Google maps
  • Cómo enfocar el marcador de Google por marcador de título?
  • android + google map api v2 + ubicación actual
  • Google maps - posición de la cámara con marcador en la parte inferior
  • Cómo actualizar marcadores en el mapa cuando se utiliza ClusterManager
  • Obtenga la dirección de inicio / oficina de google maps
  • ¿Todavía es necesario el permiso READ_GSERVICES para Google Maps?
  • Cómo mostrar los marcadores todo el tiempo por AsyncTask o Handler en google map versión 2
  • Google Maps Android Clustering OnCameraChangeListener () despreciado
  • AVD No se puede probar ninguna aplicación usando AVD
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.