Планируется поддержка разных типов аудио- и видеоочков.

Поддерживаемые XR-устройства
Это руководство поможет вам создавать продукты для таких XR-устройств.
Аудио- и
видеоочки

У разных моделей аудио- и видеоочков разные возможности. Например, хотя все аудио- и видеоочки поддерживают голосовое управление, только у видеоочков есть экран, на котором ваше приложение может показывать интерфейсы, созданные с помощью Jetpack Compose Glimmer.

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

Жизненный цикл прогнозируемых действий

Действие, которое вы создаете для аудио- и видеоочков, не выполняется непосредственно на устройстве, а проецируется на него с хост-устройства (например, телефона пользователя). Специальные действия, которые вы создаете для этой цели, называются прогнозируемыми действиями. Жизненный цикл проецируемых объектов activity основан на стандартном жизненном цикле объекта activity, но имеет несколько ключевых отличий, которые обеспечивают поддержку возможностей разных типов аудиоочков и видеоочков.

Рисунок 1. Ключевые события в жизненном цикле прогнозируемых действий.

Ниже приведены ключевые события и взаимодействия, характерные для аудио- и видеоочков.

  • onCreate()
    • Вызывается при создании прогнозируемого действия.
    • Инициализируйте интерфейс Jetpack Compose Glimmer и другие компоненты приложения.
  • onStart()
    • Вызывается, когда начинается прогнозируемое действие и пользователь знает о приложении.
  • onResume()
    • Вызывается, когда проецируемое действие снова оказывается в фокусе. Пока активность находится в фокусе, с ней можно взаимодействовать, используя сенсорную панель или кнопки.
    • Вызывается, когда пользователь надевает очки после того, как снял их.
  • onPause()
    • Вызывается, когда проецируемое действие теряет фокус, но пользователь по-прежнему видит ваше приложение. Пока действие находится вне фокуса, оно не может взаимодействовать с пользователем и перестает принимать входные данные.
  • onStop()
    • Вызывается, когда система считает, что пользователь больше не взаимодействует с вашим приложением.
    • Вызывается, когда очки снимают с головы.
  • onDestroy()
    • Вызывается, когда транслируемое действие будет удалено. При вызове этого метода система освобождает все ресурсы, связанные с операцией.

Как состояние экрана влияет на жизненный цикл объекта activity

В стандартном Activity статус жизненного цикла меняется, когда экран устройства выключается. Обычно статус меняется на onPause() или onStop(). В отличие от этого, жизненный цикл объекта activity, проецируемого на очки, не меняется при включении или выключении дисплея. Это означает, что проецируемый объект activity продолжает работать в состоянии Started или Resumed, даже когда дисплей выключен, что позволяет аудио в вашем приложении продолжать воспроизводиться без прерывания.

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

Как осведомленность пользователей влияет на прогнозируемую активность

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

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

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

  • Статус onStart() для прогнозируемых действий означает, что действие активно.
  • Состояние onResume() означает, что с действием можно взаимодействовать и оно может получать входные данные от сенсорной панели или основного устройства ввода.

Пока пользователь знает о вашем приложении, ваше действие остается активным и на переднем плане. Если система не обнаруживает сигналов внимания в течение короткого периода времени, она убирает действие с переднего плана и в конечном итоге запускает onStop().

Прогнозируемые действия и контексты

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

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

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

  • Для приложений и сервисов на телефоне. Если части приложения, которая не относится к проецируемым действиям (например, действию на телефоне или сервису), требуется доступ к аппаратным компонентам очков, она должна явно получить контекст проецирования. Для этого используйте метод createProjectedDeviceContext().

Подробнее о том, как использовать проецируемый контекст для доступа к аппаратным компонентам аудио- и видеоочков…

Как работают API с учетом устройств

Некоторые стандартные API Android меняют аппаратное обеспечение устройства, к которому они обращаются, в зависимости от значения Context вызывающего действия. Когда эти API получают спроецированный контекст, они обращаются к аппаратным компонентам очков, а не телефона:

  • CameraManager – доступ к камере очков.
  • SensorManager – получает данные датчиков (например, гироскопа или акселерометра) от очков.
  • AudioManager управляет аудиопотоками, громкостью и маршрутизацией на очках.