java.lang.IllegalStateException:必须连接GoogleApiClient

时间:2015-12-10 08:43:26

标签: java android google-plus-signin

我正在制作此应用,我需要通过Google登录验证用户的电子邮件。

java.lang.IllegalStateException方法中获取帐户名称时,我收到了onConnected

仅在选择要使用的帐户后才会发生。当它发生时,帐户会被保存但由于错误而无法清除,因此下次不需要询问使用哪个帐户并再次运行。发生错误时,client.isConnected()client.isConnecting都返回false。 这对我没有意义,因为GoogleApiClient应始终以onConnected方式连接。我的代码:

@Override
public void onConnected(Bundle bundle){
    //connected to Google plus
    Log.d(TAG, "onConnected");
    mShouldResolve = false;

    //get email
    //error happens during the getAccountName() call
    prefs.edit().putString("email", Plus.AccountApi.getAccountName(googleClient)).apply();

    //user needs to select account next time too: for debug purposes
    Plus.AccountApi.clearDefaultAccount(googleClient);
    //we just needed the email
    googleClient.disconnect();

    view.findViewById(R.id.loginProgressBar).setVisibility(View.INVISIBLE);

    //show "Create new account?"
    chooseRegister();
}//onConnected

我知道在client.disconnect()期间调用onConnected是不典型的,但错误发生在它之前。

编辑2: 这实际上是一个片段,客户端init如下:

googleClient = new GoogleApiClient.Builder(getActivity())
            .addConnectionCallbacks(this)
            .addOnConnectionFailedListener(this)
            .addApi(Plus.API)
            .addScope(new Scope(Scopes.PROFILE))
            .build();

其中getActivity()是父活动,this是片段。这会产生影响吗?我应该将父活动作为接口实现者,并将调用重定向到片段吗?

编辑3:尝试使用父活动作为回调的监听器,它也没有帮助。

编辑: 有人会要求它,即使它没有用,所以:错误堆栈跟踪:

java.lang.IllegalStateException: GoogleApiClient must be connected.
com.google.android.gms.common.internal.zzx.zza(Unknown Source)
com.google.android.gms.plus.Plus.zzf(Unknown Source)
com.google.android.gms.internal.zzqe.getAccountName(Unknown Source)
com.myfirm.myproject.LoginFragment.onConnected(LoginFragment.java:148)
com.google.android.gms.common.internal.zzk.zzh(Unknown Source)
com.google.android.gms.internal.zzlg.zznU(Unknown Source)
com.google.android.gms.internal.zzlg.onConnected(Unknown Source)
com.google.android.gms.internal.zzli$2.onConnected(Unknown Source)
com.google.android.gms.common.internal.zzj$zzg.zzpf(Unknown Source)
com.google.android.gms.common.internal.zzj$zza.zzc(Unknown Source)
com.google.android.gms.common.internal.zzj$zza.zzt(Unknown Source)
com.google.android.gms.common.internal.zzj$zzc.zzph(Unknown Source)
com.google.android.gms.common.internal.zzj$zzb.handleMessage(Unknown Source)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:145)
at android.app.ActivityThread.main(ActivityThread.java:6117)
at java.lang.reflect.Method.invoke(Native Method)
at java.lang.reflect.Method.invoke(Method.java:372)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1399)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1194)

2 个答案:

答案 0 :(得分:0)

之前我遇到过这个错误,也许这个链接可以帮到你:
http://www.androidhive.info/2014/02/android-login-with-google-plus-account-1/
您必须在使用Google Plus API时保持Google客户端连接

答案 1 :(得分:0)

好的,我解决了这个问题:由于某种原因重新创建了片段,因此googleClient也被重新创建,新的片段也没有连接。

逻辑上,这不应该影响其他片段的客户端,但它是一个静态变量。 (实际上不再需要了,忘了改变)

尚不确定,但片段可能已重新创建,因为Google客户端的帐户选择器是片段。因此对于具有相同问题的其他人:多层片段是问题所在。他们经常会感到困惑。