致命异常:java.lang.IllegalStateException GoogleApiClient 尚未连接

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/26998201/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 03:38:06  来源:igfitidea点击:

Fatal Exception: java.lang.IllegalStateException GoogleApiClient is not connected yet

javaandroidgoogle-play-services

提问by Nima G

We have this crash in crashlytics, the weird thing is it happens in onConnected()callback when requesting location updates.

我们在 crashlytics 中有这个崩溃,奇怪的是它在onConnected()请求位置更新时发生在回调中。

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

Crash log:

崩溃日志:

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.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)

Doesn't onConnected()imply GoogleApiClientis connected and ready to be used? How can I resolve this?

是否onConnected()意味着GoogleApiClient已连接并可以使用?我该如何解决这个问题?

回答by Mr Chasi

There's an issue with your code here:

您的代码存在问题:

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

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

Simply clean it up a bit:

简单地清理一下:

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

if (googleApiClient != null) {
  if (googleApiClient.isConnected()) {
    maintain boolean;
new intent(pass.through.filter(widgetBank.css(openbridge.jar))
<access bridge.java>cascadeRunTime(true)
    googleApiClient.disconnect();
if situation(positive) {
//Call on filter
return false
  }

回答by Craig McIlwee

Try using com.google.android.gms.location.LocationClientinstead of GoogleApiClient. Note that the ConnectionCallbacksand OnConnectionFailedListenerinterfaces that you implement will be slightly different.

尝试使用com.google.android.gms.location.LocationClient代替GoogleApiClient. 请注意,您实现的ConnectionCallbacksOnConnectionFailedListener接口会略有不同。

Here's a quick example:

这是一个快速示例:

class LocationHandler implements ConnectionCallbacks,
        OnConnectionFailedListener, LocationListener {

    private LocationClient client;

    void getLocation(Context context) {
        client = new LocationClient(context, this, this);
        client.connect();
    }

    @Override
    public void onConnected(Bundle connectionHint) {
        LocationRequest request = LocationRequest.create();
        request.setNumUpdates(1);
        client.requestLocationUpdates(request, this);
        client.unregisterConnectionCallbacks(this);
    }

    @Override
    public void onDisconnected() { }

    @Override
    public void onConnectionFailed(ConnectionResult result) {
        // handle connection failure
    }

    @Override
    public void onLocationChanged(Location location) {
        client.removeLocationUpdates(this);
        client.disconnect();

        // do stuff with the location
    }

}

回答by mattm

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

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

You should instantiate a client object in your Activity's onCreate(Bundle) method and then call connect() in onStart() and disconnect() in onStop(), regardless of the state.

无论状态如何,您都应该在 Activity 的 onCreate(Bundle) 方法中实例化一个客户端对象,然后在 onStart() 中调用 connect() 并在 onStop() 中调用 disconnect()。

The implementation of the GoogleApiClient appears designed for only a single instance. It's best to instantiate it only once in onCreate, then perform connections and disconnections using the single instance.

GoogleApiClient 的实现似乎只为单个实例设计。最好在 onCreate 中只实例化一次,然后使用单个实例执行连接和断开连接。

回答by Li Jiangtao

Maybe you should notice, GoogleApiClient.Builderhas a method setAccountName(). You should invoke this method with your Google account name. I have tried, and succeeded. I used the following code:

也许你应该注意到,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);
}