wake-up-neo.net

Verursacht durch: Java.lang.IllegalStateException: GoogleApiClient ist noch nicht verbunden

Diese Fehlermeldung wird angezeigt, wenn Sie versuchen, die Abmeldung für Google Sign-In für Android zu implementieren:

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

Der Absturz tritt in DrawerActivity.Java (unten) auf, wo ich die signOut () -Methode aufrufe.

Ich habe mir die Lösungen in anderen Beiträgen angesehen und sie erfolglos ausprobiert:

Java.lang.IllegalStateException: GoogleApiClient ist noch nicht verbunden

GoogleApiClient ist noch keine Ausnahme verbundenSchwerwiegende Ausnahme: Java.lang.IllegalStateException GoogleApiClient ist noch nicht verbunden

Hauptaktivität.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 (wo ich die Abmeldung durchführen möchte)

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

In meiner App-Aktivität, die die Anwendung erweitert (zum Speichern des GoogleApiClient verwendet)

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

Jede Hilfe wäre dankbar. Vielen Dank!

8
Vinnie

Sie sollten das Threading aufgeben und einfach eine zweite GoogleApiClient erstellen. Laut diesem Beitrag ( https://stackoverflow.com/a/25190497/608347 ) ist der Client kein schweres Objekt. Sie sollten also möglicherweise das verwirrende Design vermeiden und die Dinge einfacher machen. Selbst wenn Sie diesen Pfad nicht begehen, sollten Sie den Code #setClient und #getClient entfernen und prüfen, ob Sie beim Trennen der Verbindung zu einer einzelnen Aktivität dieselbe Fehlermeldung erhalten

8

Ich weiß, es ist ein ziemlich alter Beitrag und hat schon geantwortet.

Die eigentliche Fehlerursache ist jedoch nicht die Objekterstellung an einer oder mehreren Stellen, sondern der Aufruf "enableAutoManage" zum Zeitpunkt des Erstellens eines Client-Objekts.

Das API doc here schlägt vor, dass es automatisch das Lebenszyklusmanagement durch Aufrufen von Methoden auf onStart & onStop-Methoden der Aktivität übernimmt.

Wenn Sie dasselbe Objekt für verschiedene Aktivitäten verwenden möchten, sollten Sie daher den Aufruf von "enableAutoManage" und den Aufruf von apiObject.connect (vorzugsweise in onStart of activity) und apiObject.disconnect () (vorzugsweise in onStop of activity) vermeiden.

Das hat für mich funktioniert, also teilen.

5
Chota Bheem

So erstellen Sie eine Schaltfläche Abmelden in einer anderen Aktivität, zum Beispiel: Die Anmeldung befindet sich in der Aktivität A und die Abmeldung in der Aktivität B, dann können Sie diese für die zweite Aktivität verwenden.

Erstellen Sie zuerst die OnStart-Methode:

 @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();
}

Nachdem Sie in Ihrem Button diese zusammengestellt haben:

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);
        }
    });
2

Entferne das:

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