Android用のGoogleサインインのログアウトを実装しようとすると、次のエラーメッセージが表示されます。
Caused by: Java.lang.IllegalStateException: GoogleApiClient is not connected yet.
クラッシュは、signOut()メソッドを呼び出すDrawerActivity.Java(下記)で発生します。
私は他の投稿で解決策を見て、役に立たないように試みました:
Java.lang.IllegalStateException:GoogleApiClientはまだ接続されていません
GoogleApiClientはまだ接続されていません例外致命的な例外:Java.lang.IllegalStateException GoogleApiClientはまだ接続されていません
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
どんな助けでもいただければ幸いです。ありがとう!
スレッドを捨てて、2番目のGoogleApiClient
を作成する必要があります。この投稿( https://stackoverflow.com/a/25190497/608347 )によると、クライアントは重いオブジェクトではないので、混乱するデザインを避けて、物事をシンプルにすることもできます。この道をたどらなくても、それを取り除く必要があります#setClient
および#getClient
コードを作成し、単一のアクティビティから切断したときに同じエラーが発生するかどうかを確認します
私はそのかなり古い投稿を知っていて、すでに答えました。
ただし、エラーの実際の原因は、単一または複数の場所でのオブジェクトの作成ではなく、クライアントオブジェクトの構築時の「enableAutoManage」の呼び出しです。
APIドキュメント ここ は、アクティビティのonStartメソッドとonStopメソッドのメソッドを呼び出すことにより、ライフサイクル管理を自動的に行うことを提案しています。
したがって、異なるアクティビティ間で同じオブジェクトを使用する場合は、「enableAutoManage」の呼び出しを避け、apiObject.connect(できればonStartのアクティビティ)とapiObject.disconnect()(できればonStopのアクティビティ)を呼び出す必要があります。
これは私にとってはうまくいったので、共有しました。
たとえば、別のアクティビティで[サインアウト]ボタンを作成するには、ログインがアクティビティAにあり、サインアウトがアクティビティBにある場合、これを2番目のアクティビティに使用できます。
まず、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);
}
});
これを削除:
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)