6

接続されていないGoogleはサインインのためのAndroidのためにログアウトを実装しようとしたとき、私はこのエラーメッセージを取得しています:GoogleApiClientがまだ

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

クラッシュがDrawerActivity.javaで発生(下)、ここで私はsignOut()メソッドを呼び出します。

私は他の記事で解決策を見てきましたし、無駄にそれらを試してみました:で

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

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 DrawerActivity.java(ログアウトを実行する場所)

(GoogleApiClientを格納するために使用される)アプリケーションを拡張し、私のアプリのアクティビティで
private void googleSignOut(){ 
    mGoogleApiClient = App.getInstance().getClient(); 
    Auth.GoogleSignInApi.signOut(mGoogleApiClient); 
} 

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 

任意の助けいただければ幸いです。ありがとう!

+1

を常にフルスタックトレースが含まれており、あなたのコードの行を指摘し、それが起こる場所。 –

+0

申し訳ありません@DougStevenson、私は今stacktraceを含めました。 – Vinnie

+0

接続されていない場合は、最初に接続してください。 – Shmuel

答えて

6

スレッドを削除し、2番目のGoogleApiClientを作成するだけです。このポスト(https://stackoverflow.com/a/25190497/608347)によれば、クライアントは重いオブジェクトではないので、混乱する設計を避け、簡単にすることもできます。この道を踏み外さなくても、と#getClientのコードを除外して、単一の活動から切断するときに同じエラーが発生するかどうかを確認する必要があります。

+0

ありがとう@Scotty!署名を実行するアクティビティで新しいGoogleApiClientを作成すると、エラーが修正されました。 – Vinnie

4

私はかなり古い投稿を知っています。

ただし、エラーの実際の原因は、単一または複数の場所でオブジェクトを作成するのではなく、Building Clientオブジェクトの時点で「enableAutoManage」を呼び出すことです。

APIドキュメントhereは、アクティビティのonStartメソッドonStart &のメソッドを呼び出すことによって、ライフサイクル管理を自動的に行うことを提案しています。

したがって、異なるアクティビティで同じオブジェクトを使用する場合は、「enableAutoManage」を呼び出してapiObject.connect(アクティビティのonStartで使用することをお勧めします)およびapiObject.disconnect()(アクティビティのonStopにあることが望ましい) 。

これは私のために働いたので、分かち合いました。

+1

神はあなたを祝福します!正確に私が対処していたもの: –

+1

神は祝福します。Bheem:P – Yashasvi

0

この削除:ログインアクティビティAにあり、看板アウトは、アクティビティBであり、そしてあなたは:ボタンは、例えば、他の活動にログアウトさせるには

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

+0

なぜあなたは答えを良くすることができますか? – Nrzonline

0

を2番目のアクティビティにこれを使用できます。

まず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); 
     } 
    }); 
関連する問題