web-dev-qa-db-ja.com

致命的な例外:Java.lang.IllegalStateException GoogleApiClientはまだ接続されていません

Crashlyticsでこのクラッシュが発生しましたが、奇妙なことに、位置の更新を要求するときにonConnected()コールバックで発生します。

コード:

_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();
  }
_

クラッシュログ:

_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()は、GoogleApiClientが接続され、使用する準備ができていることを意味しませんか?どうすれば解決できますか?

20
Nima G

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

アクティビティのonCreate(Bundle)メソッドでクライアントオブジェクトをインスタンス化し、状態に関係なくonStart()でconnect()およびonStop()でdisconnect()を呼び出す必要があります。

GoogleApiClientの実装は、単一のインスタンス専用に設計されているようです。 onCreateでインスタンス化するのは一度だけにしてから、単一のインスタンスを使用して接続と切断を実行するのが最善です。

9
mattm

_GoogleApiClient.Builder_にはメソッドsetAccountName()があります。このメソッドは、Googleアカウント名で呼び出す必要があります。私は試しましたが、成功しました。次のコードを使用しました。

_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