Вызвано: java.lang.IllegalStateException: GoogleApiClient еще не подключен
При попытке выйти из системы для входа в Google для Android появляется следующее сообщение об ошибке:
Caused by: java.lang.IllegalStateException: GoogleApiClient is not connected yet.
Сбой происходит в DrawerActivity.java (ниже), где я вызываю метод signOut().
Я посмотрел на решения в других постах и попробовал их безрезультатно:
java.lang.IllegalStateException: GoogleApiClient еще не подключен
GoogleApiClient еще не подключен Исключение Fatal Exception: 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
Любая помощь будет оценена. Спасибо!
4 ответа
Вы должны прервать поток и просто создать второй GoogleApiClient
, Согласно этому сообщению ( /questions/36077224/sozdanie-googleapiclient-dlya-neskolkih-dejstvij/36077232#36077232) клиент не является тяжелым объектом, поэтому может также избежать запутанного дизайна и упростить задачу. Даже если вы не пойдете по этому пути, вы должны раздеть это #setClient
а также #getClient
код и посмотреть, если вы получаете ту же ошибку при отключении от одного действия
Я знаю его довольно старый пост и уже ответил.
Однако действительной причиной ошибки является не создание объекта в одном или нескольких местах, а вызов "enableAutoManage" во время создания объекта "Клиент".
Документ API здесь предполагает, что он будет автоматически управлять жизненным циклом, вызывая методы в методах onStart и onStop операции.
Поэтому, если вы хотите использовать один и тот же объект в разных действиях, вам следует избегать вызова "enableAutoManage" и вызывать apiObject.connect (предпочтительно в onStart of activity) и apiObject.disconnect() (предпочтительно в onStop of activity).
Это сработало для меня, поэтому делюсь.
Чтобы сделать кнопку "Выйти" в другом действии, например: имя входа находится в действии 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);
}
});
Удали это:
.enableAutoManage(this /* FragmentActivity */, this /* OnConnectionFailedListener */)
Вы можете проверить, подключен он или нет.
if (mGoogleApiClient.isConnected()) {
//your code
}