3

わかりました。現在、アプリ内に 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()

4

2 に答える 2

0

AsyncTask で作成しようとしましたが、機能しました。

public  class RevokeAccess extends AsyncTask<String, Void, Void> {
    private  ProgressDialog progressDialog;
    private Context mContext;

    public RevokeAccess(Context context){
        mContext = context;
    }

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        progressDialog = new ProgressDialog(mContext);
        progressDialog.setMessage("Loading...");
        progressDialog.show();
    }


    protected Void doInBackground(String... urls) {

            Plus.AccountApi.clearDefaultAccount(mGoogleApiClient);
            Plus.AccountApi.revokeAccessAndDisconnect(mGoogleApiClient);
            mGoogleApiClient.disconnect();

        return null;
    }

    protected void onPostExecute(Void result) {
        progressDialog.dismiss();
        FragmentDrawer.mDrawerLayout.closeDrawers();
        ConnectActivity connectActivity = new ConnectActivity();
        getSupportFragmentManager().beginTransaction().replace(R.id.container_body, connectActivity).commit();
    }


}
于 2015-10-10T17:32:56.593 に答える