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

Применимые устройства XR
Данное руководство поможет вам создавать приложения для устройств XR такого типа.
Аудио и
Очки для демонстрации

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

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

Понять жизненный цикл запланированных мероприятий.

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

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

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

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

Поймите, как состояние дисплея влияет на прогнозируемый жизненный цикл активности.

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

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

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

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

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

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

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

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

Понимание планируемых мероприятий и прогнозируемых условий.

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

В зависимости от контекста вызывающей активности, контекст приложения может быть предоставлен автоматически:

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

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

Для получения дополнительной информации см. раздел «Использование проецируемого контекста для доступа к оборудованию на аудиоочках и очках с дисплеем» .

Разберитесь в API, учитывающих особенности устройства.

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

  • CameraManager : Обеспечивает доступ к камере очков.
  • SensorManager : Получает данные с датчиков (например, данные гироскопа или акселерометра) из очков.
  • AudioManager : управляет аудиопотоками, громкостью и маршрутизацией на очках.
  • AudioRecord : Записывает звук с помощью микрофона очков.