使用AccountManager::getAuthTokenByFeatures时,会显示一个“访问请求”屏幕,供用户允许或拒绝访问该帐户。用户允许访问后,后续调用(使用相同的参数)将返回auth令牌而不提示用户。
如何清除状态以确保出现“访问请求”提示? (这至少在开发,测试和演示方面很有用。)
答案 0 :(得分:7)
我发现的唯一解决方案是手动清除存储在系统accounts.db中的数据。从命令行运行以下命令以清除系统上的所有帐户授权。
对于模拟器:
adb -e shell 'sqlite3 /data/system/accounts.db "delete from grants;"'
对于设备(必须root并且安装了sqlite3二进制文件):
adb -d shell 'echo sqlite3 /data/system/accounts.db \"delete from grants\;\" | su'
答案 1 :(得分:1)
我创建了一个用于测试的新帐户。 新帐户将始终提示访问请求。 请记住不允许访问。
要测试登录屏幕,请从其他设备/ PC更改帐户密码。
答案 2 :(得分:1)
使用Google Play服务:
http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html
将https://www.googleapis.com/auth/userinfo.profile添加到您的范围。
示例:
String scope="oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"
final String token = GoogleAuthUtil.getToken(context, "xxxx@gmail.com", scope);
或“蛮力”
Intent res = new Intent();
res.addCategory("account:xxxx@gmail.com");
res.addCategory("scope:oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
res.putExtra("service", "oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
Bundle extra= new Bundle();
extra.putString("androidPackageName","com.your.package");
res.putExtra("callerExtras",extra);
res.putExtra("androidPackageName","com.your.package");
res.putExtra("authAccount","xxxx@gmail.com");
String mPackage = "com.google.android.gms";
String mClass = "com.google.android.gms.auth.TokenActivity";
res.setComponent(new ComponentName(mPackage,mClass));
startActivityForResult(res,100);
现在,当您撤消此处https://accounts.google.com/IssuedAuthSubTokens的访问权限时,应用程序会再次在设备中显示权限窗口。
答案 3 :(得分:0)
就我而言,Benn Sandoval所说的不起作用。
我必须以编程方式撤消权限,然后再次连接。
if (googleApiClient != null && !googleApiClient.isConnecting() && googleApiClient.isConnected()){
googleApiClient.clearDefaultAccountAndReconnect();
Plus.AccountApi.revokeAccessAndDisconnect(googleApiClient).setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
Log.i("google+", "Google+ user access revoked");
googleApiClient.connect();
}
});
}
这样做我再次被要求授予google +
的权限