6

我正在试图实现对谷歌登入登出Android版时此错误消息:在DrawerActivity.java发生致:java.lang.IllegalStateException:GoogleApiClient未连接尚未

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

崩溃(下面),我称之为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 

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

+1

如果有碰撞,总是包含完整的堆栈跟踪,并在代码中指出的线它发生的地方。 –

+0

对不起@DougStevenson,我现在已经包含了堆栈跟踪。 – Vinnie

+0

为什么你不打电话连接,如果它没有连接? – Shmuel

回答

6

你应该沟渠穿线,并创建第二个GoogleApiClient。根据这篇文章(https://stackoverflow.com/a/25190497/608347),客户端不是一个沉重的对象,所以不妨设置混乱的设计,让事情变得简单。即使你不走这条路,你应该去掉#setClient#getClient的代码,看看你是否在从单个活动断开连接时得到相同的错误

+0

谢谢@Scotty!在执行签名的活动中创建一个新的GoogleApiClient修复了错误。 – Vinnie

4

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

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

API doc here建议它会通过调用onStart方法onStart & onStop方法来自动执行生命周期管理。因此,如果你想跨不同的活动使用相同的对象,那么你应该避免调用“enableAutoManage”并调用apiObject.connect(最好在onStart of activity中)和apiObject.disconnect()(最好在activity的onStop中) 。

这对我有用,因此共享。

+1

上帝保佑你,先生!正是我在处理:) –

+1

上帝保佑Chota Bheem:P – Yashasvi

0

删除这样:

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

+0

你能改善你的答案,为什么更好的解释? – Nrzonline

0

为了让一个按钮注销另一个动作,例如:登录是在活动A和登出是在活动B,然后你可以将其用于第二个活动。

首先创建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); 
     } 
    });