LocationClient reconecta automáticamente en `onDisconnect`

Intenté volver a conectar con LocationClient cuando la conexión se pierde (cuando el usuario limpia la RAM).

He intentado usar este código:

private final GooglePlayServicesClient.ConnectionCallbacks mConnectionCallback = new GooglePlayServicesClient.ConnectionCallbacks() { @Override public void onDisconnected() { mLocationClient.removeLocationUpdates(mLocationListener); mLocationClient.disconnect(); mLocationClient= null; mLocationClient= new LocationClient(mContext, mConnectionCallback, mConnectionFailedCallback); mLocationClient.connect(); // NULL POINTER EXCEPTION } @Override public void onConnected(Bundle bundle) { ... } }; 

Pero obtengo NullPointerException en mLocaitonClient.connect() .

 10-15 08:33:26.478: E/AndroidRuntime(19572): FATAL EXCEPTION: main 10-15 08:33:26.478: E/AndroidRuntime(19572): java.lang.NullPointerException 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.bh.a(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.kf(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.k$e.onServiceConnected(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.la(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.k.connect(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.location.LocationClient.connect(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.myapp.MyLocationClient$1.onDisconnected(MyLocationClient.java:92) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.kA(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.k$e.onServiceDisconnected(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.google.android.gms.internal.l$a$a.onServiceDisconnected(Unknown Source) 10-15 08:33:26.478: E/AndroidRuntime(19572): at android.app.LoadedApk$ServiceDispatcher.doDeath(LoadedApk.java:1102) 10-15 08:33:26.478: E/AndroidRuntime(19572): at android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1116) 10-15 08:33:26.478: E/AndroidRuntime(19572): at android.os.Handler.handleCallback(Handler.java:615) 10-15 08:33:26.478: E/AndroidRuntime(19572): at android.os.Handler.dispatchMessage(Handler.java:92) 10-15 08:33:26.478: E/AndroidRuntime(19572): at android.os.Looper.loop(Looper.java:137) 10-15 08:33:26.478: E/AndroidRuntime(19572): at android.app.ActivityThread.main(ActivityThread.java:4898) 10-15 08:33:26.478: E/AndroidRuntime(19572): at java.lang.reflect.Method.invokeNative(Native Method) 10-15 08:33:26.478: E/AndroidRuntime(19572): at java.lang.reflect.Method.invoke(Method.java:511) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006) 10-15 08:33:26.478: E/AndroidRuntime(19572): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773) 10-15 08:33:26.478: E/AndroidRuntime(19572): at dalvik.system.NativeStart.main(Native Method) 

¿Cómo puedo solucionarlo y volver a conectarlo?

Una solución aún más simple es no hacer nada en OnDisconnect .

 public void onDisconnect(){ //do nothing to client } 

Cuando la necesidad de utilizar el cliente simplemente comprobar si está conectado

 if(mLocationClient.isconnected()){ mLocationClient.connect(); } 

Los Servicios de Google Play parecen volver a conectarse bien con el alboroto.

He utilizado esto en 4.0.4 y 4.2.2 con éxito.

¡Encontré la solución! Sólo use el Handler .

 @Override public void onDisconnected() { new Handler().post(new Runnable() { @Override public void run() { mLocationClient.removeLocationUpdates(mLocationListener); mLocationClient.disconnect(); mLocationClient = null; mLocationClient = new LocationClient(mContext, mConnectionCallback, mConnectionFailedCallback); mLocationClient.connect(); // NOW WORKING } } } 

En la documentación oficial ( http://developer.android.com/reference/com/google/android/gms/location/LocationClient.html ), está escrito que:

 public void disconnect () 

"Cierra la conexión a los servicios de Google Play. No se pueden hacer llamadas en este objeto después de llamar a este método."

Así que no puedes llamar a connect() justo después, tienes que volver a crear el objeto LocationClient como lo hiciste la primera vez para conectarte de nuevo.

  • Hacer que Android Geofences permanezca activo hasta que se haya eliminado / caducado o solo hasta que se inicie mi PendingIntent
  • ¿Existe una alternativa al Cliente de ubicación (API de Google Play)?
  • Do Geofences permanece activo en android después de reiniciar el dispositivo
  • API de geocodificación de Android BroadcastReceiver no activado
  • API de ubicación de Google: solicita actualizaciones de ubicación con intención pendiente?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.