Android 6.0 Marshmallow предоставляет пользователям новый способ взаимодействия с приложениями с помощью приложений-помощников, таких как Google Assistant . Помощник — это окно верхнего уровня, которое пользователи могут просматривать для получения контекстно релевантных действий для текущего действия. Эти действия могут включать глубокие ссылки на другие приложения на устройстве.
Пользователи активируют помощника долгим нажатием кнопки «Домой» или произнесением ключевой фразы . В ответ система открывает окно верхнего уровня, в котором отображаются контекстно-релевантные действия.
Приложение-помощник, такое как Google Assistant, реализует наложение окна помощника с помощью функции Now on Tap, которая работает с функциональностью уровня платформы Android. Система позволяет пользователю выбрать приложение-помощник, которое получает контекстную информацию из вашего приложения с помощью Android Assist API.
В этом руководстве объясняется, как приложения Android используют Android Assist API для улучшения взаимодействия с помощником. Чтобы узнать, как создать мультимедийное приложение, чтобы Ассистент мог запускать его и управлять им, см. Google Assistant и мультимедийные приложения .
Использование помощников
На рис. 1 показано типичное взаимодействие пользователя с помощником. Когда пользователь долго нажимает кнопку «Домой», в исходном приложении вызываются обратные вызовы API Assist (шаг 1). Помощник визуализирует окно наложения (шаги 2 и 3), а затем пользователь выбирает действие, которое необходимо выполнить. Ассистент выполняет выбранное действие, например запускает намерение с глубокой ссылкой на приложение ресторана ( пункт назначения ) (шаг 4).
![](https://developer.android.com/static/images/training/assistant/image01.png?authuser=19&hl=ru)
Рис. 1. Пример взаимодействия Ассистента с функцией Now on Tap в приложении Google.
Пользователи могут настроить помощника, выбрав «Настройки» > «Приложения» > «Приложения по умолчанию» > «Помощь и голосовой ввод» . Пользователи могут изменять параметры системы, такие как доступ к содержимому экрана в виде текста и доступ к снимку экрана, как показано на рисунке 2.
![](https://developer.android.com/static/images/training/assistant/image02.png?authuser=19&hl=ru)
Рисунок 2. Настройки помощи и голосового ввода
Исходное приложение
Чтобы ваше приложение работало с помощником как с источником информации для пользователя, вам нужно всего лишь следовать рекомендациям по обеспечению специальных возможностей . В этом разделе описывается, как предоставить дополнительную информацию, которая поможет улучшить взаимодействие с пользователем с помощником, а также сценарии, требующие специальной обработки, такие как пользовательские представления.
Поделитесь дополнительной информацией с ассистентом
Помимо текста и снимка экрана ваше приложение может передавать помощнику другую информацию. Например, ваше музыкальное приложение может передать информацию о текущем альбоме, чтобы помощник мог предложить более разумные действия, адаптированные к текущему действию. Обратите внимание, что API-интерфейсы Assist не предоставляют элементы управления мультимедиа. Чтобы добавить элементы управления мультимедиа, используйте Google Assistant и медиа-приложения .
Чтобы предоставить дополнительную информацию помощнику, ваше приложение предоставляет глобальный контекст приложения , регистрируя прослушиватель приложения, и предоставляет информацию о конкретных действиях с помощью обратных вызовов действий, как показано на рисунке 3:
![](https://developer.android.com/static/images/training/assistant/image03.png?authuser=19&hl=ru)
Рисунок 3. Диаграмма последовательности жизненного цикла API Assist.
Чтобы обеспечить глобальный контекст приложения, приложение создает реализацию Application.OnProvideAssistDataListener
и регистрирует ее с помощью registerOnProvideAssistDataListener()
. Чтобы предоставить контекстную информацию, специфичную для действия, действие переопределяет onProvideAssistData()
и onProvideAssistContent()
. Два метода действия вызываются после вызова необязательного глобального обратного вызова. Поскольку обратные вызовы выполняются в основном потоке, они должны завершиться быстро . Обратные вызовы вызываются только во время выполнения действия.
Предоставление контекста
Когда пользователь активирует помощника, вызывается onProvideAssistData()
для создания полного намерения ACTION_ASSIST
со всем контекстом текущего приложения, представленным как экземпляр AssistStructure
. Вы можете переопределить этот метод, чтобы поместить в пакет все, что захотите, и оно появится в части EXTRA_ASSIST_CONTEXT
вспомогательного намерения.
Описание контента
Ваше приложение может реализовать onProvideAssistContent()
чтобы улучшить взаимодействие с пользователем с помощью помощника, предоставляя ссылки, связанные с контентом, связанные с текущим действием. Вы можете описать содержимое приложения, используя общий словарь, определенный Schema.org , через объект JSON-LD. В приведенном ниже примере музыкальное приложение предоставляет структурированные данные для описания музыкального альбома, который в данный момент просматривает пользователь:
Котлин
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 }
Ява
@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()
, которые могут предоставить следующие преимущества:
- Корректирует предоставленное содержание контента, чтобы лучше отражать контекст действия верхнего уровня.
- Предоставляет URI отображаемого содержимого.
- Заполняет
setClipData()
дополнительным интересующим контентом, который в данный момент просматривает пользователь.
Примечание. Приложениям, использующим собственную реализацию выбора текста, вероятно, потребуется реализовать onProvideAssistContent()
и вызвать setClipData()
.
Реализация по умолчанию
Если ни обратный вызов onProvideAssistData()
ни обратный вызов onProvideAssistContent()
не реализован, система все равно продолжает работу и передает автоматически собранную информацию помощнику, если только текущее окно не помечено как безопасное . Как показано на рисунке 3, система использует реализации onProvideStructure()
и onProvideVirtualStructure()
по умолчанию для сбора текста и просмотра информации об иерархии. Если ваше представление реализует пользовательское рисование текста, переопределите onProvideStructure()
чтобы предоставить помощнику текст, отображаемый пользователю, путем вызова setText(CharSequence)
.
В большинстве случаев реализация поддержки доступности позволяет помощнику получить необходимую ему информацию. Чтобы реализовать поддержку специальных возможностей, следуйте рекомендациям, описанным в разделе «Обеспечение доступности приложений» , включая следующие:
- Укажите атрибуты
android:contentDescription
. - Заполните
AccessibilityNodeInfo
для пользовательских представлений. - Убедитесь, что пользовательские объекты
ViewGroup
правильно предоставляют свои дочерние элементы.
Исключение просмотров от помощников
Для обработки конфиденциальной информации ваше приложение может исключить текущее представление из помощника, установив параметр макета FLAG_SECURE
WindowManager
. Вы должны явно установить FLAG_SECURE
для каждого окна, созданного действием, включая диалоговые окна. Ваше приложение также может использовать setSecure()
, чтобы исключить поверхность из помощника. Не существует глобального механизма (на уровне приложения), позволяющего исключить все представления из Ассистента. Обратите внимание, что FLAG_SECURE
не приводит к остановке обратных вызовов Assist API. Действие, использующее FLAG_SECURE
по-прежнему может явно предоставлять информацию приложению-помощнику, используя обратные вызовы, описанные ранее в этом руководстве.
Примечание. Для корпоративных учетных записей (Android for Work) администратор может отключить сбор данных помощника для рабочего профиля с помощью метода setScreenCaptureDisabled()
API DevicePolicyManager
.
Голосовое взаимодействие
Обратные вызовы Assist API также вызываются при обнаружении ключевой фразы . Дополнительную информацию см. в документации по голосовым действиям .
Соображения о Z-порядке
Помощник использует легкое наложение, отображаемое поверх текущего действия. Поскольку пользователь может активировать помощника в любое время, не создавайте постоянные окна системных предупреждений , которые мешают наложенному окну, как показано на рисунке 4.
![](https://developer.android.com/static/images/training/assistant/image04.png?authuser=19&hl=ru)
Рисунок 4. Z-порядок вспомогательного слоя
Если в вашем приложении используются окна системных предупреждений , немедленно удалите их, поскольку оставление их на экране ухудшает удобство работы пользователя.
Целевое приложение
Приложения-помощники обычно используют глубокие ссылки для поиска целевых приложений. Чтобы сделать ваше приложение потенциальным целевым приложением, рассмотрите возможность добавления поддержки диплинкинга . Сопоставление между текущим пользовательским контекстом и глубокими ссылками или другими потенциальными действиями, отображаемыми в окне наложения (показанное на шаге 3 на рисунке 1), зависит от реализации Google Assistant. Например, приложение Google Assistant использует глубокие ссылки и ссылки на приложения для привлечения трафика к целевым приложениям.
Реализация собственного помощника
Возможно, вы захотите реализовать своего собственного помощника. Как показано на рисунке 2 , пользователь может выбрать приложение активного помощника. Приложение-помощник должно предоставить реализацию VoiceInteractionSessionService
и VoiceInteractionSession
, как показано в этом примере VoiceInteraction
. Для этого также требуется разрешение BIND_VOICE_INTERACTION
. Затем помощник может получить иерархию текста и представлений, представленную как экземпляр AssistStructure
в onHandleAssist()
. Он получает снимок экрана через onHandleScreenshot()
.