Вызвано: 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 еще не подключен

Основная активность.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

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


person VIN    schedule 07.03.2016    source источник
comment
В случае сбоя всегда включайте полную трассировку стека и указывайте строку кода, где это происходит.   -  person Doug Stevenson    schedule 07.03.2016
comment
Извините, @DougStevenson, я включил трассировку стека.   -  person VIN    schedule 08.03.2016
comment
почему бы вам сначала не вызвать соединение, если оно не подключено?   -  person Shmuel    schedule 08.03.2016
comment
@Shmuel, я сделал это, используя mGoogleApiClient.connect() в onStart ();, но это не имеет никакого эффекта. Я получаю такое же сообщение о сбое. Я также вызвал .connect() в методе signOut(), все еще то же самое сообщение о сбое.   -  person VIN    schedule 08.03.2016
comment
Можете ли вы добавить журналирование в метод #handleSignInResult. Этот метод может вызываться с неудачным результатом, что означает, что #setClient никогда не вызывается.   -  person Scott Tomaszewski    schedule 08.03.2016
comment
Привет, @Scotty, result.isSuccess() оценивается как true, поэтому на самом деле вызывается App.getInstance().setClient(mGoogleApiClient);.   -  person VIN    schedule 08.03.2016
comment
Вам следует подумать об отказе от многопоточности и просто создать второй GoogleApiClient. Согласно этому сообщению (stackoverflow.com/a/25190497/608347), клиент не является тяжелым объектом, поэтому может Избегайте запутанного дизайна и делайте все просто. Даже если вы не пойдете по этому пути, вы должны удалить этот код #setClient и #getClient и посмотреть, получите ли вы ту же ошибку при отключении от одного действия.   -  person Scott Tomaszewski    schedule 08.03.2016
comment
Спасибо @Скотти! Я создал новый GoogleApiClient в методе onCreate DrawerActivity.java, и он сработал. Если вы опубликуете это как ответ, я приму это :)   -  person VIN    schedule 08.03.2016


Ответы (5)


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

person Scott Tomaszewski    schedule 08.03.2016
comment
Спасибо @Скотти! Создание нового GoogleApiClient в действии, где я выполняю выход, исправило ошибку. - person VIN; 08.03.2016

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

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

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

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

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

person Chota Bheem    schedule 02.10.2016
comment
Да благословит вас Бог, сэр! Как раз то, с чем я имел дело :) - person Matej Špilár; 17.03.2017
comment
Боже, благослови Чота Бхим :P - person Yash; 04.04.2017
comment
Работал как прелесть еще! - person Dhruvam Sharma; 08.01.2020

Чтобы сделать кнопку «Выйти» в другом действии, например: вход в действие 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);
        }
    });
person Jose Manuel Duran    schedule 27.02.2018

Удалить это:

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

person Tharaka Karunadheera    schedule 04.10.2017
comment
Можете ли вы улучшить свой ответ, объяснив, почему? - person Nrzonline; 04.10.2017
comment
Если вы удаляете это, следуйте stackoverflow.com/a/30627422/2598244. - person Md Mohsin; 07.12.2019

вы можете проверить, подключен ли он или нет.

 if (mGoogleApiClient.isConnected()) {

          //your code
  }
person behrad    schedule 14.10.2020