わかりました。現在、アプリ内に Google Drive API 接続を実装しているため、ユーザーは Google Plus アカウントを介してサインインしています。私の問題は、GoogleApiClient.isConnected()
常に正確であるとは限らないことです。問題は、(Android Google Plus のドキュメントで定義されている手順を使用して) サインインすると、次のメソッドを呼び出して、ユーザーの Google Play アカウントへのアプリのアクセスを取り消そうとすることです。
/**
* Revokes the user access given to application and disconnects from their account
*/
public void onGoogleRevokeAndDisconnect()
{
if(mGoogleApiClient.isConnected()) {
//clear account
Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
//revoke and disconnect
Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status arg0) {
Toast.makeText(MainActivity.this, "Account disconnected succesfully!",Toast.LENGTH_LONG).show();
mGoogleApiClient.isConnected();
//mGoogleApiClient.disconnect();//TODO: Find out why this is necessary to make this not break
//reconnect
mGoogleApiClient.connect();
//Update button states in SettingsFragment
mSettingsFragment.updateGoogleButtonVisibility();//no longer signed in
}
});
}
else
Toast.makeText(this, "You must be signed in to revoke access!", Toast.LENGTH_SHORT).show();
}
次にGoogleApiClient.isConnected()
、メソッドの値を確認すると、 が返されますtrue
。アカウントが取り消されて切断されているため、明らかにこれは false を返すはずです。興味深いことに、再度サインインせずにサインアウトしようとすると、次のような例外が発生します。
01-19 23:14:37.738: E/AndroidRuntime(17503):java.lang.IllegalStateException: Not connected. Call connect() and wait for onConnected() to be called.
clearDefaultAccount()
これは、サインアウト プロセス中にこのメソッド呼び出し ( ) でスローされます。ここで、既定のアカウントがクリアされます (ドキュメントhere、例外のスローについては何も述べていません) おそらくGoogleApiClient.isConnected()
、このメソッドはさまざまな方法でチェックしますか?
また、アプリを閉じて再度開くと、アカウントを承認するように求められるため、アカウント権限が実際に取り消されたことも知っています。そして、アクセスを取り消さずに通常どおりサインアウトすると、すべてが正常に機能します。
考えられる修正:
これまでのところ機能しているように見える修正を見つけました。これはmGoogleApiClient.disconnect();
、.onResult()
revokeAccessAndDisconnect()