it-swarm.com.ru

Вызвано: Java.lang.IllegalStateException: GoogleApiClient еще не подключен

При попытке выйти из системы для входа в Google для Android появляется следующее сообщение об ошибке:

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

Сбой происходит в DrawerActivity.Java (ниже), где я вызываю метод signOut ().

Я посмотрел на решения в других постах и ​​попробовал их безрезультатно:

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

Любая помощь будет оценена. Спасибо!

8
Vinnie

Вы должны прервать поток и просто создать второй GoogleApiClient. Согласно этому сообщению ( https://stackoverflow.com/a/25190497/608347 ) клиент не является тяжелым объектом, поэтому он также может избежать запутанного дизайна и упростить задачу. Даже если вы не идете по этому пути, вы должны удалить этот код #setClient и #getClient и посмотреть, не возникает ли та же ошибка при отключении от одного действия

8
Scott Tomaszewski

Я знаю его довольно старый пост и уже ответил.

Однако действительной причиной ошибки является не создание объекта в одном или нескольких местах, а вызов «enableAutoManage» во время создания объекта «Клиент».

Документ API здесь предполагает, что он будет автоматически выполнять управление жизненным циклом, вызывая методы в методах onStart и onStop операции.

Поэтому, если вы хотите использовать один и тот же объект в разных действиях, вам следует избегать вызова «enableAutoManage» и вызывать apiObject.connect (предпочтительно в onStart of activity) и apiObject.disconnect () (предпочтительно в onStop of activity).

Это сработало для меня, поэтому делюсь.

5
Chota Bheem

Чтобы сделать кнопку «Выйти» в другом действии, например: имя входа находится в действии A, а выход - в действии B, вы можете использовать это для второго действия.

Сначала создайте метод 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);
        }
    });
2
Jose Manuel Duran

Удали это:

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

0
Tharaka Karunadheera