使用 Firebase 身份验证和谷歌登录时注销时“GoogleApiClient 尚未连接”

Posted

技术标签:

【中文标题】使用 Firebase 身份验证和谷歌登录时注销时“GoogleApiClient 尚未连接”【英文标题】:"GoogleApiClient is not connected yet" on logout when using Firebase auth with google sign in 【发布时间】:2016-10-28 14:29:00 【问题描述】:

我将 Firebase 身份验证与 Google 登录一起使用,但我想从另一个活动中退出,但当我使用此方法退出时,该方法在同一个活动中完美运行,但不适用于另一个活动。方法如下。

public void logOut() 
        mAuth.signOut();
        // Google sign out
        Auth.GoogleSignInApi.signOut(googleApiClient).setResultCallback(
                new ResultCallback<Status>() 
                    @Override
                    public void onResult(@NonNull Status status) 
                        authorizeUser(null);
                    
                );
    

但是当这个方法是静态的并且 googleApiClient 静态时它仍然不起作用,当我只执行时

FirebaseAuth.getInstance().signOut();

我得到的错误是这个(logcat)

E/androidRuntime: FATAL EXCEPTION: main
      Process: com.igov, PID: 21316
java.lang.IllegalStateException: GoogleApiClient is not connected yet.
      at com.google.android.gms.internal.zzoe.zzd(Unknown Source)
      at com.google.android.gms.internal.zzoh.zzd(Unknown Source)
      at com.google.android.gms.internal.zzof.zzd(Unknown Source)
      at com.google.android.gms.auth.api.signin.internal.zzc.signOut(Unknown Source)
      at com.igov.design.LoginActivity.logOut(LoginActivity.java:159)
      at com.igov.design.LoginActivity$2.onClick(LoginActivity.java:62)
      at android.view.View.performClick(View.java:5198)
      at com.igov.design.MainActivity.onNavigationItemSelected(MainActivity.java:101)
      at android.support.design.widget.NavigationView$1.onMenuItemSelected(NavigationView.java:152)
      at android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:810)
      at android.support.v7.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
      at android.support.v7.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:957)
      at android.support.design.internal.NavigationMenuPresenter$1.onClick(NavigationMenuPresenter.java:318)
      at android.view.View.performClick(View.java:5198)
      at android.view.View$PerformClick.run(View.java:21147)
      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(ZygoteInit.java:726)
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

【问题讨论】:

异常非常明确:您正在尝试使用尚未初始化的 GoogleApiClient。您是否尝试过***.com/search?q=GoogleApiClient+is+not+connected+yet 中的任何答案? 【参考方案1】:

向 Google Api 客户端注册连接回调

使用的类:

Lo​​ginActivity 类(登录活动) Lo​​goutActivity 类(注销活动)

代码:

    public void logout() 
       mGoogleApiClient.connect();
       mGoogleApiClient.registerConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() 
        @Override
        public void onConnected(@Nullable Bundle bundle) 

            FirebaseAuth.getInstance().signOut();
            if(mGoogleApiClient.isConnected()) 
                Auth.GoogleSignInApi.signOut(mGoogleApiClient).setResultCallback(new ResultCallback<Status>() 
                    @Override
                    public void onResult(@NonNull Status status) 
                        if (status.isSuccess()) 
                            Log.d(TAG, "User Logged out");
                            Intent intent = new Intent(LogoutActivity.this, LoginActivity.class);
                            startActivity(intent);
                            finish();
                        
                    
                );
            
        

        @Override
        public void onConnectionSuspended(int i) 
            Log.d(TAG, "Google API Client Connection Suspended");
        
    );

【讨论】:

如果您仍然遇到问题,请随时发表评论。 嘿我试过你的代码..我在这一行得到空指针异常:mGoogleApiClient.connect(); 我认为您还需要在流程完成后添加 unregisterConnectionCallbacks。【参考方案2】:

如果您使用 google 登录并从其他活动中注销并遇到此错误,尤其是在注销时,请检查此行,如果您在代码中找到它,然后将其删除。

                                mGoogleApiClient = GoogleApiClient.Builder(this)
/*this line should be removed*/.enableAutoManage(this , this)
                               .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                               .build()

【讨论】:

以上是关于使用 Firebase 身份验证和谷歌登录时注销时“GoogleApiClient 尚未连接”的主要内容,如果未能解决你的问题,请参考以下文章

无法使用 Flutter 和 Firebase 设置 Facebook 身份验证

Firebase:注销后登录卡在加载中

在 Flutter 中使用 Firebase/Google 登录时无法注销并重定向到 LoginPage

使用 firebase authWithPassword 时定期注销

Firebase 身份验证。更新所有项目文件

使用Firebase Google用户身份验证更改用户