как проверить, доступен ли Google authenticator на устройстве Android?

#android

#Android

Вопрос:

Мое приложение для Android использует AccountManager API для доступа к Google Finance. Есть ли какая-либо функция / атрибут в AndroidManifest.xml или любой другой метод, который я могу использовать, чтобы убедиться, что приложение будет доступно только на устройствах, на которых установлен Google authenticator (дополнение)?

Ответ №1:

  1. AccountManager доступен с уровня API 5, это означает, что он будет доступен на всех устройствах с Android 2.0 или выше.

  2. Вы можете проверить наличие учетной записи Google с помощью getAccountsByType with com.google в качестве типа учетной записи.

  3. Даже если на устройстве установлена версия Android 2.0 или выше, нет гарантии, что пользователь настроит учетную запись Google. У них не будет доступа к Market или другим приложениям Google (gmail, maps и т.д.), Но все остальное будет работать.

Просто делайте, как делает Google: когда пользователь запускает приложение, проверьте, есть ли правильная учетная запись, и если нет, уведомите пользователя и остановите приложение.

Комментарии:

1. Предполагая, что на этом устройстве установлен Google API (поверх Android 2.0), мы должны иметь возможность перенаправить пользователя в настройки для настройки новой учетной записи. Мне нужен способ выяснить, установлено ли дополнение для Google authenticator, в отличие от выяснения, настроили ли они какие-либо учетные записи Google.

2. В эмуляторе Android опция «добавить учетную запись Google» будет отображаться в настройках, только если для целевого параметра установлен Google API (уровень 8) на платформе 2.2 или выше!

Ответ №2:

Это связано не только с Google account authenticator, такое поведение является общим:

 AccountManager.get(context).addAccount(
                    <google account type>,
                    <needed token type>,
                    null,
                    <options or null if not needed>,
                    activityToStartAccountAddActivity,
                    new AccountManagerCallback<Bundle>() {
                        @Override
                        public void run(AccountManagerFuture<Bundle> future {
                            try {
                                future.getResult();
                            } catch (OperationCanceledException e) {
                                throw new RuntimeException(e);
                            } catch (IOException e) {
                                throw new RuntimeException(e);
                            } catch (AuthenticatorException e) {
                                throw new RuntimeException(e); // you'll go here with "bind failure" if google account authenticator is not installed
                            }
                        }
                    },
                    null);
  

Если у вас на устройстве не установлен authenticator, который поддерживает как запрошенный тип учетной записи, так и тип токена, вы получите AuthenticatorException. В принципе, Google authenticator есть на любом устройстве Android. Конечно, если он не рутирован и связанный пакет не удален 🙂

Комментарии:

1. Это связано не только с Google account authenticator, такое поведение мы получаем, когда аутентификатор не зарегистрирован для необходимого типа токена, переданного в качестве аргумента

Ответ №3:

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

Попытка добавить учетную запись с последующей проверкой на исключение также не идеальна, когда существует метод AccountManager.getAuthenticatorTypes() . Используйте его следующим образом:

 String type = "com.example"; // Account type of target authenticator
AccountManager am = AccountManager.get(this);
AuthenticatorDescription[] authenticators = am.getAuthenticatorTypes();
for (int i = 0; i < authenticators.length();   i) {
    if (authenticators[i].type.equals(type)) {
        return true; // Authenticator for accounts of type "com.example" exists.
    }
return false; // no authenticator was found.
  

Моя Java немного устарела (я разработчик Xamarin), но это должно дать вам представление о том, как проверить наличие средства аутентификации в системе, не вызывая действие добавления учетной записи, если оно существует.

Источники:
getAuthenticatorTypes
AuthenticatorDescription.type