Как проверить доступность аудиоочков и дисплейных очков во время выполнения

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

В течение дня аудио- или видеоочки могут потерять связь с основным устройством (например, телефоном) или стать временно недоступными, если пользователь их снимет. Чтобы учитывать такие изменения в доступности устройств, ваше приложение может использовать API доступности XR-устройств, который объединяет сигналы доступности устройств со стандартными значениями Android Lifecycle.State. Этот API позволяет управлять маршрутизацией аудио, активацией голосовой команды и определять, когда ожидать ввода данных пользователем, исходя из того, доступны ли очки.

Статусы жизненного цикла

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

Статус жизненного цикла

Статус устройства

Описание

INITIALIZED

Время создания

Объект жизненного цикла создан, но ещё не наблюдается.

CREATED

Неактивно

Сервис подключен, но пользователь не носит устройство.

STARTED

Активно

Пользователь носит устройство.

DESTROYED

Нет связи

Устройство отключено или связь с сервисом потеряна.

RESUMED

Н/Д

В настоящее время жизненный цикл устройства не использует и не передает это состояние.

Как проверять и отслеживать доступность устройств

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

    // In your phone activity or service, check for projected device connection state before
    // attempting to create a projected device context and get the device lifecycle.
    ProjectedContext.isProjectedDeviceConnected(context, currentCoroutineContext())
        .flatMapLatest { isConnected ->
            if (isConnected) {
                try {
                    // Create the projected device context on connection
                    val projectedContext = ProjectedContext.createProjectedDeviceContext(context)
                    val xrDevice = XrDevice.getCurrentDevice(projectedContext)

                    // Get the device lifecycle
                    xrDevice.getLifecycle().currentStateFlow
                } catch (e: IllegalStateException) {
                    flowOf(Lifecycle.State.DESTROYED)
                }
            } else {
                flowOf(Lifecycle.State.DESTROYED)
            }
        }
        .collect { state ->
            when (state) {
                Lifecycle.State.STARTED -> { /* Device is available (worn) */ }
                Lifecycle.State.CREATED -> { /* Device is unavailable (not worn) */ }
                Lifecycle.State.DESTROYED -> { /* Device is disconnected from host phone */ }
                else -> { /* Handle other states */ }
            }
        }
}

Ключевые моменты

  • Проверьте подключение. Перед тем как получить доступ к жизненному циклу устройства, вызовите ProjectedContext.isProjectedDeviceConnected, чтобы убедиться, что проецируемое устройство подключено к основному.
  • Получите ProjectedContext. Звоните в ProjectedContext.createProjectedDeviceContext только после того, как убедитесь в наличии подключения, и обязательно передайте этот контекст в свой экземпляр XrDevice.
  • Обрабатывайте недействительность контекста. Каждый раз, когда подключается проецируемое устройство, создается новый deviceId. Когда состояние достигает DESTROYED, текущий ProjectedContext становится недействительным. Немедленно прекратите его использование и дождитесь нового подключения.
  • Оптимизировать расход заряда батареи и ресурсов. Корректно обрабатывать функции приложения в зависимости от состояния жизненного цикла, чтобы экономить системные ресурсы и заряд батареи. Например, при переходе из состояния STARTED в CREATED необходимо освободить ресурсы, используемые очками, такие как поток данных с камеры. Статус CREATED означает, что устройство больше не используется, поэтому остановка этих процессов необходима, чтобы предотвратить ненужный расход заряда батареи и обеспечить конфиденциальность пользователя.