web-dev-qa-db-fra.com

Fatal Exception: Java.lang.IllegalStateException GoogleApiClient n'est pas encore connecté

Nous avons ce crash dans crashlytics, ce qui est étrange, c’est que cela se produit dans le rappel onConnected() lors de la demande de mise à jour de la position.

Code:

abstract public class MainService_6_LocationClient extends MainService_5_DriverGpsLocationStoring
    implements GoogleApiClient.ConnectionCallbacks, GoogleApiClient.OnConnectionFailedListener {


  private LocationListener highAccuracyListener;
  private GoogleApiClient googleApiClient;
  private LocationRequest gpsRequest;

  @Override
  public void onCreate() {
    super.onCreate();
    lazyInit();
    googleApiClient.connect();
  }

  @Override public void onConnected(Bundle bundle) {
    Log.d(TAG, "onConnected");
    lazyInit();
    LocationServices.FusedLocationApi.requestLocationUpdates(googleApiClient, gpsRequest,
          highAccuracyListener);
  }

  private void lazyInit() {

    if (highAccuracyListener == null) {
      highAccuracyListener = new HighAccuracyLocationListener();
    }

    if (googleApiClient == null) {
      googleApiClient = new GoogleApiClient.Builder(this).addApi(LocationServices.API)
          .addConnectionCallbacks(this)
          .addOnConnectionFailedListener(this)
          .build();
    }

    if (gpsRequest == null) {
      gpsRequest = new LocationRequest().setInterval(2000)
          .setFastestInterval(1000)
          .setSmallestDisplacement(0)
          .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
    }
  }

  @Override public void onConnectionSuspended(int i) {
    Log.w(TAG, "onConnectionSuspended");
    lazyInit();
    googleApiClient.reconnect();
  }

  @Override public void onConnectionFailed(ConnectionResult connectionResult) {
    Log.e(TAG, "onConnectionFailed");
  }

  @Override public void onDestroy() {
    Log.d(TAG, "onDestroy");

    if (googleApiClient != null) {
      if (googleApiClient.isConnected()) {
        LocationServices.FusedLocationApi.removeLocationUpdates(googleApiClient,
            highAccuracyListener);
        googleApiClient.disconnect();
      }

      googleApiClient = null;
    }
    highAccuracyListener = null;
    gpsRequest = null;

    super.onDestroy();
  }

Journal des collisions:

Java.lang.IllegalStateException: GoogleApiClient is not connected yet.
       at com.google.Android.gms.common.internal.o.a()
       at com.google.Android.gms.common.api.b.b()
       at com.google.Android.gms.internal.lu.requestLocationUpdates()
       at ee.mtakso.driver.service.orderState.MainService_6_LocationClient.onConnected(MainService_6_LocationClient.Java:33)
       at com.google.Android.gms.common.internal.f.d()
       at com.google.Android.gms.common.api.b.gm()
       at com.google.Android.gms.common.api.b.d()
       at com.google.Android.gms.common.api.b$2.onConnected()
       at com.google.Android.gms.common.internal.f.d()
       at com.google.Android.gms.common.internal.f.dL()
       at com.google.Android.gms.common.internal.e$h.b()
       at com.google.Android.gms.common.internal.e$h.g()
       at com.google.Android.gms.common.internal.e$b.gU()
       at com.google.Android.gms.common.internal.e$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:4947)
       at Java.lang.reflect.Method.invokeNative(Method.Java)
       at Java.lang.reflect.Method.invoke(Method.Java:511)
       at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:1038)
       at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:805)
       at dalvik.system.NativeStart.main(NativeStart.Java)

onConnected() implique t-il que GoogleApiClient est connecté et prêt à être utilisé? Comment puis-je résoudre ça?

20
ItsNotAboutTheName

https://developer.Android.com/reference/com/google/Android/gms/common/api/GoogleApiClient.html

Vous devez instancier un objet client dans la méthode onCreate (Bundle) de votre activité puis appeler connect () dans onStart () et disconnect () dans onStop (), quel que soit l'état.

L'implémentation de GoogleApiClient semble conçue pour une seule instance. Il est préférable de ne l'instancier qu'une seule fois dans onCreate, puis d'effectuer des connexions et des déconnexions à l'aide d'une seule instance. 

10
mattm

Vous devriez peut-être remarquer que GoogleApiClient.Builder a une méthode setAccountName(). Vous devez appeler cette méthode avec le nom de votre compte Google. J'ai essayé et réussi. J'ai utilisé le code suivant:

if (mGoogleApiClient == null) {
    mGoogleApiClient = new GoogleApiClient.Builder(context)
       .addApi(LocationServices.API)
       .addConnectionCallbacks(this)
       .addOnConnectionFailedListener(this)
       .setAccountName("李江涛")
       .build();
}

if (mLocationRequest == null) {
    mLocationRequest = new LocationRequest();
    mLocationRequest.setInterval(10000);
    mLocationRequest.setFastestInterval(5000);
    mLocationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
}
1
Li Jiangtao