Не удается получить AuthToken для пользовательской учетной записи из другого приложения

у меня есть два приложения, которые работают с одного типа счета. Я хочу, чтобы ниже страница была показана, когда пользователь открывает второе приложение в первый раз и существует одна учетная запись:

enter image description here

но ничего не происходит, когда я запускаю этот код:

final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, null, null);

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Bundle bnd = future.getResult();

            final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
            showMessage((authtoken != null) ? "SUCCESS!ntoken: " + authtoken : "FAIL");
            Log.d("udinic", "GetToken Bundle is " + bnd);
        } catch (Exception e) {
            e.printStackTrace();
            showMessage(e.getMessage());
        }
    }
}).start();

приведенный выше код работает правильно, когда я запускаю его из приложения, что Аутентификатор. Когда я запускаю код ниже, система генерирует уведомление о том, что когда я нажимаю на него, вышеуказанное изображение кажется.

final AccountManagerFuture<Bundle> future = mAccountManager
        .getAuthToken(account, authTokenType, null, true,
                null, handler);

нажатие кнопки Разрешить возвращает AuthToken правильно. Однако я хочу видеть страницу разрешения grant (выше изображения) при вызове getAuthToken, не нажав на уведомление. Как я могу это сделать?

2 ответов


я использовал этот метод вместо предыдущего и теперь я вижу диалоговое окно подтверждения:

accountManager.getAuthToken(account, AUTH_TOKEN_TYPE_FULL_ACCESS, null, true, new AccountManagerCallback<Bundle>() {
            @Override
            public void run(AccountManagerFuture<Bundle> future) {
                try {
                    Bundle bundle = future.getResult();
                    String authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);

                } catch (OperationCanceledException | IOException | AuthenticatorException e) {

                }
            }
}, null);

обратите внимание, что второе приложение должно иметь другую подпись. Если оба приложения имеют одинаковую подпись, подтверждение не требуется и authToken будет получать.


несколько вещей, чтобы пойти сюда. Использование потока в Android обычно считается плохой практикой, в документах Android рекомендуется использовать асинхронную задачу или обработчик. Теперь для сообщения Auth на документацию Android ожидаемым выходом является уведомление.

getAuthToken(Account account, String authTokenType, Bundle options, boolean notifyAuthFailure, AccountManagerCallback<Bundle> callback, Handler handler)

получает токен аутентификации указанного типа для определенной учетной записи, при необходимости вызов уведомления, если пользователь должен ввести учетные данные.

обратите внимание, как getAuthToken имеет параметр обработчика? Это был бы предпочтительный метод для обработки задачи async. Проблема здесь you CAN NOT have a full screen message on a handler thread, because it can't interrupt the UI thread. в первом примере вы фактически вызываете call mAccountManager в потоке пользовательского интерфейса, поэтому он позволяет ему взять на себя пользовательский интерфейс и отправить полноэкранное сообщение allow или deny, однако это нельзя сделать с помощью обработчика, поскольку обработчик не может использовать поток пользовательского интерфейса (выдаст ошибку во время выполнения).

мой предлагаемое решение? Не используйте обработчик, если вы хотите прерывать полноэкранный режим сообщение, выполните действие в потоке пользовательского интерфейса, аналогичное вашему первому фрагменту кода.

AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, callback, null); 
//USE implements and implement a listener in the class declaration and 
//use 'this' in the callback param OR create a new callback method for it