Causés par: java.lang.IllegalStateException: GoogleApiClient n'est pas encore connecté
J'obtiens ce message d'erreur lorsque vous essayez de mettre en œuvre de déconnexion pour la connexion Google pour Android:
Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet.
L'incident se produit dans DrawerActivity.java (ci-dessous), où j'ai appeler le signOut() la méthode.
J'ai regardé les solutions dans d'autres posts et ont essayé, sans succès:
java.lang.IllegalStateException: GoogleApiClient n'est pas encore connecté
GoogleApiClient n'est pas encore connecté exception
Fatal 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 (lorsque je veux effectuer la déconnexion)
private void googleSignOut(){
mGoogleApiClient = App.getInstance().getClient();
Auth.GoogleSignInApi.signOut(mGoogleApiClient);
}
Dans mon Application une activité qui étend le champ d'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;
}
}
StackTrace:
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!
- Si il y a un crash, toujours inclure toute la trace de la pile et le point de la ligne dans votre code où il se produit.
- Désolé @DougStevenson, j'ai inclus la stacktrace maintenant.
- pourquoi ne pas vous appeler connecter d'abord si elle n'est pas connectée?
- Je l'ai fait, à l'aide de
mGoogleApiClient.connect()
dans onStart();, mais il n'a aucun effet. Je reçois le même crash message. J'ai également appelé .connect() dans le signOut() la méthode, toujours le même plantage du message. - Pouvez-vous ajouter un peu de journalisation pour le
#handleSignInResult
méthode. Cette méthode peut obtenir appelé avec un résultat à défaut ce qui voudrait dire#setClient
n'est jamais appelé - Hey @Scotty,
result.isSuccess()
évalue à true, alors laApp.getInstance().setClient(mGoogleApiClient);
est en fait appelé. - Vous devriez envisager d'amerrissage forcé l'enfilage et il suffit de créer un deuxième
GoogleApiClient
. Selon ce post (stackoverflow.com/a/25190497/608347) le client n'est pas un objet lourd qui pourrait ainsi éviter la confusion de la conception et de faire des choses simples. Même si vous n'allez pas dans cette voie, vous devez bande que#setClient
et#getClient
code et de voir si vous recevez le même message d'erreur lors de la déconnexion d'une seule activité. - Merci @Scotty! J'ai créé un nouveau GoogleApiClient dans le DrawerActivity.java s'méthode onCreate et cela a fonctionné. Si vous poster la réponse, je vais l'accepter 🙂
Vous devez vous connecter pour publier un commentaire.
Vous devriez abandonner l'enfilage et il suffit de créer un deuxième
GoogleApiClient
. Selon ce post (https://stackoverflow.com/a/25190497/608347) le client n'est pas un objet lourd qui pourrait ainsi éviter la confusion de la conception et de faire des choses simples. Même si vous n'allez pas dans cette voie, vous devez bande que#setClient
et#getClient
code et de voir si vous recevez le même message d'erreur lors de la déconnexion d'une activité uniqueJe sais que je suis assez vieux post et déjà répondu.
Cependant, la cause de l'erreur n'est pas la création d'un objet à un seul ou de multiples endroits, mais "enableAutoManage" l'invocation au moment de la Construction de l'objet Client.
La doc API ici suggère qu'il serait automatiquement faire la gestion du cycle de vie par des appels de méthodes sur onStart & onStop méthodes de l'activité.
Par conséquent, si vous souhaitez utiliser le même objet à travers différentes activités, alors vous devriez éviter d'appeler "enableAutoManage" et invoquer apiObject.se connecter(de préférence dans le démarrage de l'activité) et apiObject.disconnect() (de préférence en onStop de l'activité).
Cela a fonctionné pour moi, donc de partage.
De faire un bouton de Signer dans une autre Activité, par exemple: le nom d'utilisateur est dans l'Activité et le signe est dans l'activité B, alors vous pouvez l'utiliser pour la deuxième activité.
D'abord créer la méthode OnStart:
Après dans votre bouton de collocation de cette:
Supprimer ce:
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)