使用AccountManager::getAuthTokenByFeatures时,会显示一个访问请求屏幕,供用户允许或拒绝访问该帐户。用户允许访问后,后续调用(使用相同的参数)会在不提示用户的情况下返回身份验证令牌。
如何清除状态以确保出现访问请求提示?(这至少对于开发、测试和演示目的很有用。)
使用AccountManager::getAuthTokenByFeatures时,会显示一个访问请求屏幕,供用户允许或拒绝访问该帐户。用户允许访问后,后续调用(使用相同的参数)会在不提示用户的情况下返回身份验证令牌。
如何清除状态以确保出现访问请求提示?(这至少对于开发、测试和演示目的很有用。)
我找到的唯一解决方案是手动清除存储在系统 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'
我创建了一个用于测试的新帐户。新帐户将始终提示访问请求。记住不允许访问。
要测试登录屏幕,请从另一台设备/PC 更改帐户的密码。
使用 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时,应用程序会再次在设备中向您显示权限窗口。
就我而言,本·桑多瓦尔所说的不起作用。
我不得不以编程方式撤销权限,然后再次连接。
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+ 权限