在用户已经允许访问后,如何强制AccountManager显示“访问请求”屏幕?

使用AccountManager :: getAuthTokenByFeatures时 ,会显示一个访问请求屏幕,允许或拒绝用户访问该帐户。 用户允许访问后,后续调用(具有相同的参数)将返回身份validation令牌,而不会提示用户。

如何清除状态以确保访问请求提示符出现? (这对于开发,testing和演示至less是有用的。)

我发现的唯一解决scheme是手动清除存储在系统的accounts.db中的数据。 从命令行运行以下命令清除系统上的所有帐户授权。

对于模拟器:

adb -e shell 'sqlite3 /data/system/accounts.db "delete from grants;"' 

对于一个设备(必须根植并安装了sqlite3二进制文件):

 adb -d shell 'echo sqlite3 /data/system/accounts.db \"delete from grants\;\" | su' 

我创build了一个用于testing的新帐户。 新帐户将始终提示访问请求。 请记住不要允许访问。

要testinglogin屏幕,请从其他设备/ 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(); } }); } 

这样做,我再次被要求授予权限到谷歌+