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()这是在注销过程中在此方法调用()中抛出的,默认帐户被清除(此处的文档,其中没有说明引发异常的任何内容)也许GoogleApiClient.isConnected()并且此方法以不同的方式检查?

我也知道帐户权限确实被撤销了,因为当我关闭应用程序并重新打开它时,再次提示我授权我的帐户。当我正常退出时,没有撤销访问权限,一切正常。

可能的修复: 我确实找到了一个到目前为止似乎正在工作的修复 - 这mGoogleApiClient.disconnect();onResult()使用revokeAccessAndDisconnect().

4

2 回答 2

0

我认为您不需要使用revokeAccessAndDisconnect(),而不是使用disconnect(),因为我认为它仍在与旧数据连接。简单的代码如下:

if(mGoogleApiClient.isConnected()) {
    mGoogleApiClient.clearDefaultAccount(); 
    mGoogleApiClient.disconnect();
  }
于 2015-01-21T22:28:13.390 回答
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 回答