调用Plus.AccountApi.revokeAccessAndDisconnect()后,GoogleApiClient.isConnected()返回true。

时间:2015-01-20 04:13:07

标签: android google-drive-api google-play-services google-plus-signin

好的,我目前正在我的应用中实施Google Drive API连接,因此我让用户通过他们的Google Plus帐号登录。我的问题是GoogleApiClient.isConnected()似乎并不总是准确的。问题是,如果我登录(使用Android Google Plus文档here中定义的程序,然后我尝试通过调用此方法撤消该应用对用户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()方法中的{{1}}手动断开与googleApiClient的连接。

2 个答案:

答案 0 :(得分:0)

我认为您不需要使用revokeAccessAndDisconnect(),而不是使用disconnect(),因为我认为它仍然与旧数据相关联。 简单的代码就像:

if(mGoogleApiClient.isConnected()) {
    mGoogleApiClient.clearDefaultAccount(); 
    mGoogleApiClient.disconnect();
  }

答案 1 :(得分: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();
    }


}