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

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

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

Понимание состояний жизненного цикла

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

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

Состояние устройства

Описание

INITIALIZED

Созданный

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

CREATED

Неактивный

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

STARTED

Активный

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

DESTROYED

Отключено

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

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

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

    // 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 указывает на то, что устройство больше не используется, поэтому остановка этих процессов необходима для предотвращения ненужного расхода батареи и обеспечения конфиденциальности пользователя.