2015-05-07 3 views
2

i (скажем, приложение «C») пытается получить токен аутентификации установленного приложения (скажем, «S») через функцию getAuthToken для учетной записи Android AccountManager.Android AccountManager's getAuthToken SecurityException

эта функция не работает, как ожидалось, он не возвращает никаких результатов (функция запуска никогда не называется)

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»), почему он не работает? Мне что-то здесь не хватает?

Благодаря

+0

У вас есть решение по сценарию, о котором вы упомянули. Потому что я тоже застрял здесь. Пожалуйста, предоставьте свое решение, если вы его исправили. Спасибо –

ответ

0
  1. Сначала перейдите на реализацию AbstractAuthenticator в приложении S. Найти реализации getAuthToken(). Проверьте, какое действие вы возвращаете как KEY_INTENT. Он должен быть в том же приложении, что и аутентификатор (да, есть способы запуска активности из другого приложения).
  2. Убедитесь, что вы запускаете реальное устройство, потому что в этом случае вы должны увидеть экран системных настроек «разрешения прав доступа».
  3. Если вы придете сюда, я не знаю другой причины, кроме какой-то ошибки. Попробуйте полностью удалить оба приложения и перезапустить эмулятор, а затем проверить, не исчезла ли проблема.
+0

У меня такая же проблема. Я попробовал ваше решение. Но метод getAuthToken() в моем классе Authenticator никогда не вызывался. Вы знаете какую-либо причину? –

+0

Звучит как другая проблема. getAuthToken() вызывается один раз, и если вы не сделаете его недействительным, система Android вернет кешированное значение вместо последующих вызовов getAuthToken() – Deepscorn

Смежные вопросы