Оптимизация контекстного контента для Ассистента

В Android 6.0 Marshmallow появился новый способ взаимодействия пользователей с приложениями через приложения-помощники, такие как Google Ассистент. Помощник – это окно верхнего уровня, в котором пользователи могут просматривать контекстно-зависимые действия для текущей задачи. Эти действия могут включать ссылки на контент в других приложениях на устройстве.

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

Приложение-помощник, например Google Ассистент, реализует наложение помощника с помощью функции "Что на экране", которая работает на уровне платформы Android. Пользователь может выбрать приложение-помощника, которое получает контекстную информацию из вашего приложения с помощью Assist API Android.

В этом руководстве рассказывается, как приложения для Android используют Assist API, чтобы улучшить взаимодействие с помощником. Чтобы узнать, как создать приложение для мультимедиа, которое Ассистент сможет запускать и контролировать, ознакомьтесь с разделом Google Ассистент и приложения для мультимедиа.

Использование помощников

На рисунке 1 показано, как пользователь взаимодействует с Ассистентом. Когда пользователь долго удерживает кнопку главного экрана, вызываются обратные вызовы Assist API в исходном приложении (шаг 1). Помощник отрисовывает наложенное окно (шаги 2 и 3), а затем пользователь выбирает действие. Ассистент выполняет выбранное действие, например запускает намерение со ссылкой на контент в приложении ресторана (целевое приложение) (шаг 4).

Рис. 1. Пример взаимодействия с Ассистентом с помощью функции "Что на экране" в приложении Google

Чтобы настроить помощника, выберите Настройки > Приложения > Приложения по умолчанию > Помощник и голосовой ввод. Пользователи могут изменять системные настройки, например получать доступ к содержимому экрана в виде текста и делать скриншоты, как показано на рисунке 2.

Рис. 2. Настройки голосового ввода и помощника

Исходное приложение

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

Как поделиться с Ассистентом дополнительной информацией

Помимо текста и скриншота, приложение может передавать Ассистенту и другую информацию. Например, музыкальное приложение может передавать информацию о текущем альбоме, чтобы Ассистент предлагал более подходящие действия. Обратите внимание, что API Assist не предоставляют элементы управления мультимедиа. Чтобы добавить элементы управления мультимедиа, ознакомьтесь с информацией в разделе Google Ассистент и приложения для мультимедиа.

Чтобы предоставить Ассистенту дополнительную информацию, ваше приложение регистрирует слушателя приложения и предоставляет глобальный контекст приложения, а также передает информацию, относящуюся к определенному действию, с помощью обратных вызовов действий, как показано на рисунке 3:

Рис. 3. Диаграмма последовательности жизненного цикла Assist API

Чтобы предоставить глобальный контекст приложения, оно создает реализацию Application.OnProvideAssistDataListener и регистрирует ее с помощью registerOnProvideAssistDataListener(). Чтобы предоставить контекстную информацию, относящуюся к определенному действию, действие переопределяет onProvideAssistData() и onProvideAssistContent(). Оба метода activity вызываются после необязательного глобального обратного вызова. Поскольку обратные вызовы выполняются в основном потоке, они должны завершаться быстро. Обратные вызовы вызываются, только когда действие выполняется.

Предоставление контекста

Когда пользователь активирует помощника, вызывается функция onProvideAssistData(), чтобы создать полный объект намерения ACTION_ASSIST со всем контекстом текущего приложения, представленным в виде экземпляра класса AssistStructure. Вы можете переопределить этот метод, чтобы добавить в пакет любые данные, которые будут отображаться в части EXTRA_ASSIST_CONTEXT намерения-помощника.

Описание контента

В приложении можно реализовать onProvideAssistContent(), чтобы улучшить взаимодействие с Ассистентом, предоставляя ссылки на контент, относящийся к текущему действию. Вы можете описать контент приложения, используя распространенный словарь, определенный на сайте Schema.org, с помощью объекта JSON-LD. В примере ниже музыкальное приложение предоставляет структурированные данные, описывающие музыкальный альбом, который в данный момент просматривает пользователь:

Kotlin

override fun onProvideAssistContent(assistContent: AssistContent) {
    super.onProvideAssistContent(assistContent)

    val structuredJson: String = JSONObject()
            .put("@type", "MusicRecording")
            .put("@id", "https://example.com/music/recording")
            .put("name", "Album Title")
            .toString()

    assistContent.structuredData = structuredJson
}

Java

@Override
public void onProvideAssistContent(AssistContent assistContent) {
  super.onProvideAssistContent(assistContent);

  String structuredJson = new JSONObject()
       .put("@type", "MusicRecording")
       .put("@id", "https://example.com/music/recording")
       .put("name", "Album Title")
       .toString();

  assistContent.setStructuredData(structuredJson);
}

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

Примечание. Приложениям, в которых используется собственная реализация выбора текста, скорее всего, потребуется реализовать onProvideAssistContent() и вызвать setClipData().

Реализация по умолчанию

Если ни обратный вызов onProvideAssistData(), ни обратный вызов onProvideAssistContent() не реализованы, система все равно продолжит работу и передаст автоматически собранную информацию помощнику, если текущее окно не помечено как безопасное. Как показано на рисунке 3, система использует реализации по умолчанию для onProvideStructure() и onProvideVirtualStructure(), чтобы собирать текст и информацию об иерархии View. Если в вашем представлении реализована отрисовка текста, переопределите метод onProvideStructure(), чтобы предоставить Ассистенту текст, который видит пользователь, вызвав метод setText(CharSequence).

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

Как исключить просмотры, выполненные с помощью помощников

Чтобы защитить конфиденциальную информацию, ваше приложение может исключить текущее представление из помощника, задав параметр макета FLAG_SECURE для WindowManager. Вы должны явно задать FLAG_SECURE для каждого окна, созданного действием, включая диалоговые окна. Ваше приложение также может использовать setSecure(), чтобы исключить поверхность из Ассистента. На уровне приложения нет глобального механизма, позволяющего исключить все просмотры из статистики помощника. Обратите внимание, что FLAG_SECURE не приводит к прекращению вызова функций обратного вызова Assist API. Действие, в котором используется FLAG_SECURE, по-прежнему может явно предоставлять информацию приложению-помощнику с помощью обратных вызовов, описанных ранее в этом руководстве.

Примечание. Для корпоративных аккаунтов (Android for Work) администратор может отключить сбор данных помощника для рабочего профиля с помощью метода setScreenCaptureDisabled() API DevicePolicyManager.

Голосовые взаимодействия

Обратные вызовы Assist API также вызываются при обнаружении ключевой фразы. Дополнительную информацию можно найти в документации по голосовым действиям.

Порядок наложения по оси Z

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

Рис. 4. Порядок наложения вспомогательного слоя

Если в вашем приложении используются системные окна оповещений, удалите их как можно скорее, поскольку их присутствие на экране ухудшает удобство использования.

Целевое приложение

Приложения-помощники обычно используют ссылки на контент, чтобы находить целевые приложения. Чтобы ваше приложение могло стать целевым, добавьте в него поддержку ссылок на контент. Сопоставление текущего контекста пользователя и ссылок на контент или других возможных действий, отображаемых в оверлее (шаг 3 на рисунке 1), зависит от реализации Google Ассистента. Например, приложение Google Ассистента использует ссылки на контент и App Links, чтобы направлять трафик в целевые приложения.

Как реализовать собственного помощника

Вы можете реализовать собственного помощника. Как показано на рисунке 2, пользователь может выбрать активное приложение-помощника. Приложение-помощник должно реализовывать функции VoiceInteractionSessionService и VoiceInteractionSession, как показано в этом примере VoiceInteraction. Также требуется разрешение BIND_VOICE_INTERACTION. Затем помощник может получить текст и иерархию View, представленную как экземпляр AssistStructure в onHandleAssist(). Он получает скриншот через onHandleScreenshot().