好的,我目前正在我的应用中实施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的连接。
答案 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();
}
}