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

时间:2011-07-27 23:01:07

标签: android accountmanager

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

如何清除状态以确保出现“访问请求”提示? (这至少在开发,测试和演示方面很有用。)

4 个答案:

答案 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 +

的权限