Je reçois ce message d'erreur lorsque j'essaie d'implémenter la déconnexion pour Google Sign-In pour Android:
Caused by: Java.lang.IllegalStateException: GoogleApiClient is not connected yet.
Le crash se produit dans DrawerActivity.Java (ci-dessous), où j'appelle la méthode signOut ().
J'ai examiné les solutions proposées dans d'autres publications et je les ai essayées sans succès:
Java.lang.IllegalStateException: GoogleApiClient n'est pas encore connecté
GoogleApiClient n'est pas encore connecté exceptionFatal Exception: Java.lang.IllegalStateException GoogleApiClient n'est pas encore connecté
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
}
}
Dans DrawerActivity.Java (où je veux effectuer la déconnexion)
private void googleSignOut(){
mGoogleApiClient = App.getInstance().getClient();
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
}
Dans mon activité d'application qui étend l'application (utilisé pour stocker le 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;
}
}
Trace de la pile:
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
Toute aide serait appréciée. Merci!
Vous devriez abandonner le threading et créer une seconde GoogleApiClient
. Selon ce billet ( https://stackoverflow.com/a/25190497/608347 ), le client n'est pas un objet lourd, il est donc tout aussi bon d'éviter la conception confuse et de simplifier les choses. Même si vous n'allez pas dans cette voie, vous devriez éliminer les codes #setClient
et #getClient
et voir si vous obtenez le même message d'erreur lors de la déconnexion d'une seule activité.
Je connais son post assez ancien et déjà répondu.
Cependant, la cause réelle de l'erreur n'est pas la création d'objet à un ou plusieurs endroits, mais l'appel "enableAutoManage" au moment de la création de l'objet Client.
L'API doc ici suggère de gérer automatiquement le cycle de vie en appelant des méthodes sur les méthodes onStart & onStop de l'activité.
Par conséquent, si vous souhaitez utiliser le même objet pour différentes activités, évitez d'appeler "enableAutoManage" et appelez apiObject.connect (de préférence dans onStart of activity) et apiObject.disconnect () (de préférence dans onStop of activity).
Cela a fonctionné pour moi, donc partage.
Pour créer un bouton Se déconnecter dans une autre activité, par exemple: le login est dans l’activité A et la déconnexion dans l’activité B, vous pouvez l’utiliser pour la deuxième activité.
Commencez par créer la méthode 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();
}
Après dans votre bouton co-localiser ceci:
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);
}
});
Enlève ça:
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)