6

sto ottenendo questo messaggio di errore quando si cerca di implementare il logout per Google Sign-In per Android:causati da: java.lang.IllegalStateException: GoogleApiClient non è collegata ancora

Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet. 

L'incidente si verifica in DrawerActivity.java (sotto), dove chiamo il metodo signOut().

Ho guardato le soluzioni in altri post e li ho provato inutilmente:

java.lang.IllegalStateException: GoogleApiClient is not connected yet

GoogleApiClient is not connected yet exception Fatal Exception: java.lang.IllegalStateException GoogleApiClient is not connected yet

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 
    } 
} 

In DrawerActivity.java (dove voglio eseguire l'uscita)

private void googleSignOut(){ 
    mGoogleApiClient = App.getInstance().getClient(); 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient); 
} 

Nella mia attività di App che si estende Application (usato per memorizzare il 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 

Qualsiasi aiuto sarebbe apprezzato. Grazie!

+1

Se c'è un incidente, comprendono sempre la traccia stack completo e sottolineano la linea nel codice dove si verifica –

+0

Mi dispiace @DougStevenson, ho incluso lo stacktrace adesso. – Vinnie

+0

perché non chiami prima la connessione se non è collegata? – Shmuel

risposta

6

Si dovrebbe abbandonare la filettatura e basta creare un secondo GoogleApiClient. Secondo questo post (https://stackoverflow.com/a/25190497/608347) il client non è un oggetto pesante, quindi potrebbe anche evitare il design confuso e rendere le cose semplici. Anche se non si segue questo percorso, si dovrebbe togliere il codice #setClient e #getClient e vedere se si ottiene lo stesso errore quando si disconnette da una singola attività

+0

Grazie a @Scotty! La creazione di un nuovo GoogleApiClient nell'attività in cui eseguo il signout ha corretto l'errore. – Vinnie

4

Conosco il suo post piuttosto vecchio e ha già risposto.

Tuttavia, la causa effettiva dell'errore non è la creazione dell'oggetto in posizioni singole o multiple, ma la chiamata "enableAutoManage" al momento dell'oggetto Building Client.

L'API doc here suggerisce di eseguire automaticamente la gestione del ciclo di vita chiamando metodi su onStart & metodi onStop dell'attività.

Pertanto, se si desidera utilizzare lo stesso oggetto tra diverse attività, evitare di chiamare "enableAutoManage" e richiamare apiObject.connect (preferibilmente in onStart di attività) e apiObject.disconnect() (preferibilmente in onStop di attività) .

Questo ha funzionato per me, quindi condiviso.

+1

Dio vi benedica signore! Esattamente quello che avevo a che fare :) –

+1

God bless chota Bheem: P – Yashasvi

0

Inserisci questa:

.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)

+0

Puoi migliorare la tua risposta con una spiegazione migliore sul perché? – Nrzonline

0

Per creare un pulsante Esci in un'altra attività, ad esempio: l'accesso è nell'attività A e il segno fuori è nell'attività B, allora si può usare questo per la seconda attività.

Innanzitutto creare il metodo 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(); 
} 

Dopo nel vostro pulsante collocare questo:

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); 
     } 
    }); 
Problemi correlati