Диалоговое окно Google Smart Lock не отображается на устройствах Android O

Я недавно интегрировал GoogleSmartLock с моим приложением. Так или иначе, диалоговое окно сохранения не появляется на устройствах Android O, и API выдает следующую ошибку.

Диалоговое окно подтверждения сохранения API учетных данных отключено, чтобы избежать конфликтов с функцией автозаполнения Android. Этот выбор может быть переопределен через AuthCredentialsOptions.Builder.forceEnableSaveDialog()., Resolution=null}

Я проверил последние заметки о выпуске playservices и обнаружил, что следующий API может решить эту проблему.

Auth.AuthCredentialsOptions.Builder forceEnableSaveDialog ()

Но я не уверен, как использовать этот API с GoogleApIClient, так как у него нет метода сборки, который технически должен возвращать экземпляр AuthCredentialOptions. Пожалуйста, дайте мне знать, если кто-то сталкивается с той же проблемой.

3 ответа

Решение

Обновление 1: эта проблема решена в последней версии (версия 11.8.0):

  • AuthCredentialsOptions устарел, заменен новым CredentialsOptions,
  • Credentials.getClient() теперь предлагает перегрузки, которые принимают CredentialsOptions,

Примеры кода (а также дополнительная документация по использованию .forceEnableSaveDialog) доступны в разделе "Ориентация на Android O и выше" обзорной документации и были обновлены для использования нового класса параметров.

Метод build() отсутствовал в общедоступном SDK для AuthCredentialsOptions.Builder, и мы исправили его (см. Принятый ответ)

Но более важное уточнение: автозаполнение с помощью диалогового окна сохранения Google сохраняет пароли к той же базе данных Smart Lock, поэтому, если отображается диалоговое окно автозаполнения, вам не нужно беспокоиться об использовании API для принудительного отображения другого диалога (на самом деле, если вы форсируете диалог через API, убедитесь, что подавление автозаполнения одно... пользователь не должен видеть два диалога). Данные, сохраненные в любом из диалогов, будут доступны для автоматического входа в Smart Lock (и наоборот для автозаполнения), а данные синхронизируются через учетную запись Google с Chrome (автозаполнение и API).

Поскольку в диалоговых окнах данные хранятся в одном месте, мы решили показать автозаполнение с Google, когда пользователь использует Google в качестве диспетчера автозаполнения, потому что это обеспечит единообразие для всех приложений на устройствах Oreo. Работаем над улучшением сообщений об ошибках, документации и брендинга, чтобы прояснить это. Извините за путаницу.

Мне удалось использовать отражение для этого обходного пути:

Auth.AuthCredentialsOptions authCredentialsOptions = null;
try {
    Constructor<Auth.AuthCredentialsOptions> constructor = Auth.AuthCredentialsOptions.class.getDeclaredConstructor(Auth.AuthCredentialsOptions.Builder.class);
    constructor.setAccessible(true);
    authCredentialsOptions = constructor.newInstance(new Auth.AuthCredentialsOptions.Builder().forceEnableSaveDialog());
} catch (Exception e) {
    e.printStackTrace();
}
GoogleApiClient.Builder builder = new GoogleApiClient.Builder(this)
        .addConnectionCallbacks(this)
        .enableAutoManage(this, 0, this);
if (authCredentialsOptions != null) {
    builder.addApi(Auth.CREDENTIALS_API, authCredentialsOptions);
} else {
    builder.addApi(Auth.CREDENTIALS_API);
}
mGoogleApiClient = builder.build();
Другие вопросы по тегам