2015-12-10 179 views
0

我正在製作此應用程序,需要使用Google登錄驗證用戶的電子郵件。java.lang.IllegalStateException:必須連接GoogleApiClient

我收到java.lang.IllegalStateExceptiononConnected方法獲取賬戶名時!

它只發生在選擇要使用的帳戶後。發生這種情況時,帳戶會因保存錯誤而被保存但不會被清除,因此下次不需要詢問要使用哪個帳戶並重新運行。發生錯誤時,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: 這實際上是在一個片段,並且客戶端初始化如下:

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) 
+0

「LoginFragment.googleClient」可能無法連接..我不確定,這是一個猜測..有兩個googleClient? – fatboy

+0

只有一個,當從別處複製行時,忘記了'LoginFragment.'。編輯它。 – Perdex

回答

0

好吧,我解決了它:片段重新創建出於某種原因,所以googleClient g ets也重新創建,新的沒有連接。

從邏輯上講,這不應該影響其他片段的客戶端,但它是一個靜態變量。 (實際上並不需要了,忘了改變)

還不確定,但片段可能是重新創建的,因爲google客戶端的帳戶選擇器是一個片段。所以對於有同樣問題的其他人:多層碎片是問題。他們經常感到困惑。

相關問題