Android AccountManager的getAuthToken SecurityException

问题描述:

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

此功能工作不正常,它不会返回(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日志,我看到下面

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'),这是什么原因,它不工作?我在这里错过了什么?

感谢

+0

你有没有解决你提到的情况。因为我也卡在这里。如果您修复了问题,请提供您的解决方案。谢谢 –

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

我有同样的问题。我试过你的解决方案。但是我的Authenticator类中的getAuthToken()方法从未被调用过。你知道有什么理由吗? –

+0

听起来像是另一个问题。 getAuthToken()被调用一次,如果你不使它失效,android系统将返回缓存值,而不是随后调用getAuthToken() – Deepscorn