Android AccountManager的getAuthToken SecurityException

时间:2015-05-07 13:47:54

标签: android accountmanager

我(比如应用'C')我试图通过Android的AccountManager的getAuthToken函数获取已安装应用的身份验证令牌(比如'S')。

此函数未按预期工作,它不返回任何结果(永远不会调用run函数)

 AccountManagerFuture<Bundle> future1 = AccountManager.get(Main2.this).getAuthToken(account,account.type,null,false, new AccountManagerCallback<Bundle>() {
                    @Override
                    public void run(AccountManagerFuture<Bundle> future) {
                        Bundle result = null;
                        try {
                            result =   future.getResult();
                            String check = "";
                        }
                        catch (OperationCanceledException e){          }
                        catch (IOException e1){}
                        catch (AuthenticatorException e2){}

                    }
                } , new Handler(Looper.getMainLooper()));

当我看到设备ADB Logs时,我看到以下

 java.lang.SecurityException: Activity to be started with KEY_INTENT must share Authenticator's signatures
            at com.android.server.accounts.AccountManagerService$Session.onResult(AccountManagerService.java:2580)
            at com.android.server.accounts.AccountManagerService$6.onResult(AccountManagerService.java:1677)
            at com.android.server.accounts.AccountManagerService$6.onResult(AccountManagerService.java:1652)
            at android.accounts.IAccountAuthenticatorResponse$Stub.onTransact(IAccountAuthenticatorResponse.java:59)

上述应用'C'和'S'不相关,因此使用不同的证书进行签名。

我猜这个函数应该在上面的场景中工作(这是AccountManager的主要目的之一 - 跨应用程序共享帐户访问令牌)(向用户抛出一个关于他是否应该允许'的安全对话框' C'访问'S'),它是什么原因不起作用?我在这里错过了什么吗?

由于

1 个答案:

答案 0 :(得分:0)

  1. 首先在应用程序S中执行AbstractAuthenticator。查找getAuthToken()实现。检查您返回的活动为KEY_INTENT。它必须与身份验证器位于同一个应用程序中(是的,有办法从另一个应用程序启动活动)。
  2. 确保您在真实设备上运行,因为您必须看到&#34;授予权限&#34;在那种情况下的android系统屏幕。
  3. 如果你来到这里,除了一些错误之外,我不知道另一个原因。尝试完全删除这两个应用并重新启动模拟器,然后检查问题是否仍然存在。