【问题标题】:Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet原因:java.lang.IllegalStateException:GoogleApiClient 尚未连接
【发布时间】:2016-03-07 20:44:44
【问题描述】:

我在尝试为 Android 的 Google 登录实现注销时收到此错误消息:

Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet.

崩溃发生在 DrawerActivity.java(下),我在其中调用了 signOut() 方法。

我查看了其他帖子中的解决方案并尝试过但无济于事:

java.lang.IllegalStateException: GoogleApiClient is not connected yet

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

MainActivity.java:

protected void onCreate(Bundle savedInstanceState) {
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .enableAutoManage(this, this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    //... other code for google sign in not shown
}

protected void onStart() {
    mGoogleApiClient.connect();
}

private void handleSignInResult(GoogleSignInResult result) {
    if (result.isSuccess()) {
        App.getInstance().setClient(mGoogleApiClient);
        //start DrawerActivity
    }
}

在 DrawerActivity.java 中(我要在其中执行注销)

private void googleSignOut(){
    mGoogleApiClient = App.getInstance().getClient();
    Auth.GoogleSignInApi.signOut(mGoogleApiClient);
}

在我的应用程序活动中扩展应用程序(用于存储 GoogleApiClient)

public class App extends Application {

    private GoogleApiClient mGoogleApiClient;
    private static App mInstance;

    @Override
    public void onCreate() {
        super.onCreate();
        mInstance = this;
    }

    public static synchronized App getInstance() {
        return mInstance;
    }

    public void setClient(GoogleApiClient client){
        mGoogleApiClient = client;
    }

    public GoogleApiClient getClient(){
        return mGoogleApiClient;
    }
}

堆栈跟踪:

21:33.314 25375-25375/com.me.myapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.me.myapp, PID: 25375
java.lang.IllegalStateException: GoogleApiClient is not connected yet.
at com.google.android.gms.internal.zzmf.zzb(Unknown Source)
at com.google.android.gms.internal.zzmi.zzb(Unknown Source)
at com.google.android.gms.internal.zzmg.zzb(Unknown Source)
at com.google.android.gms.auth.api.signin.internal.zzc.signOut(Unknown Source)
at com.me.myapp.DrawerActivity.googleSignOut(DrawerActivity.java:526)
at com.me.myapp.DrawerActivity.onNavigationDrawerItemSelected(DrawerActivity.java:512)
at com.me.myapp.NavigationDrawerFragment.selectItem(NavigationDrawerFragment.java:201)
at com.me.myapp.NavigationDrawerFragment.access$000(NavigationDrawerFragment.java:31)
at com.me.myapp.NavigationDrawerFragment$1.onItemClick(NavigationDrawerFragment.java:98)
at android.widget.AdapterView.performItemClick(AdapterView.java:310)
at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
at android.widget.AbsListView$PerformClick.run(AbsListView.java:3042)
at android.widget.AbsListView$3.run(AbsListView.java:3879)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteI

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 如果发生崩溃,请始终包含完整的堆栈跟踪并指出代码中发生崩溃的行。
  • 对不起@DougStevenson,我现在已经包含了堆栈跟踪。
  • 如果没有连接,为什么不先调用connect?
  • @Shmuel,我已经做到了,在 onStart(); 中使用 mGoogleApiClient.connect(),但它没有任何效果。我收到相同的崩溃消息。我还在 signOut() 方法中调用了 .connect(),仍然是相同的崩溃消息。
  • 您能否在#handleSignInResult 方法中添加一些日志记录。该方法可能会因失败结果而被调用,这意味着永远不会调用 #setClient

标签: java android android-studio google-api-client android-googleapiclient


【解决方案1】:

您应该放弃线程并创建第二个GoogleApiClient。根据这篇文章 (https://stackoverflow.com/a/25190497/608347),客户端不是一个沉重的对象,所以不妨避免令人困惑的设计,让事情变得简单。即使你不走这条路,你也应该去掉 #setClient#getClient 代码,看看在与单个活动断开连接时是否会遇到同样的错误

【讨论】:

  • 谢谢@Scotty!在我执行注销的活动中创建一个新的 GoogleApiClient 修复了错误。
【解决方案2】:

我知道它很老的帖子并且已经回答了。

但是,错误的实际原因不是在单个或多个位置创建对象,而是在构建客户端对象时调用“enableAutoManage”。

API doc here 建议它将通过调用活动的 onStart 和 onStop 方法上的方法来自动进行生命周期管理。

因此,如果您想在不同的活动中使用相同的对象,那么您应该避免调用“enableAutoManage”并调用 apiObject.connect(最好在活动的 onStart 中)和 apiObject.disconnect()(最好在活动的 onStop 中)。

这对我有用,因此分享。

【讨论】:

  • 上帝保佑您,先生!正是我正在处理的:)
  • 上帝保佑 chota Bheem :P
  • 仍然有效!
【解决方案3】:

让一个按钮在另一个Activity中退出,例如:登录在Activity A,退出在Activity B,那么你可以在第二个Activity中使用这个。

首先创建 OnStart 方法:

 @Override
protected void onStart() {
    GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
            .requestEmail()
            .build();
    mGoogleApiClient = new GoogleApiClient.Builder(this)
            .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
            .build();
    mGoogleApiClient.connect();
    super.onStart();
}

在你的按钮之后搭配这个:

Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(
    new ResultCallback<Status>() {
        @Override
        public void onResult(Status status) {
            // ...
            Toast.makeText(getApplicationContext(),"Logged Out",Toast.LENGTH_SHORT).show();
            Intent i=new Intent(getApplicationContext(),MainActivity.class);
            startActivity(i);
        }
    });

【讨论】:

    【解决方案4】:

    删除这个:

    .enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)

    【讨论】:

    【解决方案5】:

    你可以检查是否连接。

     if (mGoogleApiClient.isConnected()) {
    
              //your code
      }
    

    【讨论】:

      猜你喜欢
      • 2015-02-06
      • 2018-09-30
      • 1970-01-01
      • 1970-01-01
      • 2013-04-14
      • 1970-01-01
      • 2018-02-10
      • 1970-01-01
      相关资源
      最近更新 更多