Как работает маршрутизация физического ввода для аудиоочков

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

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

Как система определяет, что пользователь знает о функции

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

  • Аудиовыход. Голосовые подсказки, звуковые сигналы или воспроизведение медиаконтента.
  • Потоки записи с микрофона. Голосовые команды или аудиозаписи окружения пользователя.
  • Потоки захвата камеры – видео- или фотопотоки.

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

Параллелизм и фокус ввода

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

  • Возобновление или остановка прогнозируемой активности приложения.
  • Перенаправление физического ввода на активное проецируемое действие.

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

Разрешите системе перезапустить транслируемое действие

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

Чтобы система могла перезапустить действие:

  1. Создайте отложенный интент. Создайте явный объект Intent, указывающий на целевое действие. Оберните намерение в PendingIntent и задайте FLAG_UPDATE_CURRENT или FLAG_IMMUTABLE, чтобы обеспечить безопасный и предсказуемый запуск.

    // Build an explicit Intent pointing to this projected activity and wrap it in a
    // PendingIntent so the system can relaunch it and route physical input to it.
    private val pendingIntent: PendingIntent by lazy {
        val intent = Intent(this, ProjectedInputFocusActivity::class.java)
    
        PendingIntent.getActivity(
            this,
            0,
            intent,
            PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
        )
    }

  2. Зарегистрируйте получатель входных данных. Получите экземпляр ProjectedActivityCompat и зарегистрируйте PendingIntent в качестве получателя входных данных, передав его в setActivityAsInputReceiver.

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
    
        lifecycleScope.launch {
            // Create or obtain the ProjectedActivityCompat instance
            val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity)
    
            // Register the PendingIntent as the designated input receiver
            projectedActivity.setActivityAsInputReceiver(pendingIntent)
        }

  3. Очищайте получатель входных данных при очистке. Когда действие уничтожается или больше не должно получать физические входные данные, очистите получатель входных данных, чтобы предотвратить устаревшие отправки PendingIntent и избежать утечек памяти.

    override fun onDestroy() {
        super.onDestroy()
        lifecycleScope.launch {
            val projectedActivity = ProjectedActivityCompat.create(this@ProjectedInputFocusActivity)
            projectedActivity.clearActivityAsInputReceiver()
        }
    }

Как фокус ввода перемещается между состояниями параллельной работы

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

Состояние параллелизма Контекст окружающей среды Поведение системы и фокус ввода Пример

Непараллельные

Активно отдельное проецируемое действие; фоновый сеанс воспроизведения медиаконтента не запущен.

Фокус ввода полностью направлен на проецируемое действие, даже в периоды тишины между считываниями.

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

Частично параллельные

Активно действие, связанное с проекцией, но фоновый сеанс воспроизведения медиаконтента приостановлен.

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

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

Параллельные

Активно двойное воспроизведение (например, аудиообъявление в вашем приложении прерывает фоновую музыку или делает ее тише).

Аудиофокус совпадает с фокусом ввода.

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

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

Защита от сбоев в работе системных часов

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

  • Льготный период для недавно запущенных проецируемых действий. Чтобы компенсировать задержки при загрузке объектов или сетевые задержки, недавно запущенным проецируемым действиям предоставляется короткий льготный период для установления потока данных и привлечения внимания пользователя, прежде чем система остановит проецируемое действие и переведет его в фоновый режим.
  • Фокус перенаправляется в зависимости от внимания пользователя. Если внимание пользователя переключается на новый активный поток данных, например аудиосообщение, система мгновенно возобновляет проецируемое действие и перенаправляет на него фокус ввода.
  • Буферы перехода во время воспроизведения медиаконтента. Когда временное озвучивание завершается во время фонового воспроизведения медиаконтента, фокус ввода на мгновение остается на проецируемом действии. Буферный период помогает предотвратить случайные действия, например когда пользователь пытается отключить звук, но вместо этого пропускает музыкальный трек. После этого система останавливает трансляцию приложения и переключает фокус ввода на элементы управления мультимедиа.
  • Бездействующие проецируемые действия останавливаются или приостанавливаются. Система останавливает любые бездействующие проецируемые действия без активных потоков данных через пару минут (или мгновенно для текущего вывода медиаконтента при приостановке).

Переход фокуса ввода на практике

Чтобы понять, как фокус ввода переходит между состояниями параллельной работы, рассмотрим следующие примеры сценариев для навигационного приложения, предоставляющего пошаговые инструкции:

Сценарий А. Непараллельные (неактивные медиа)

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

Рисунок 1. Как будет направляться фокус ввода для навигационного приложения в этом сценарии без параллельного использования.
  1. Пользователь запускает навигацию без фоновой музыки.
  2. Приложение для навигации запускает на аудиоочках транслируемое действие.
  3. Поскольку медиасеанс неактивен, навигационное приложение сохраняет фокус ввода сенсорной панели на протяжении всей поездки.
  4. Действия пользователя. Нажатие на экран во время озвучивания может отключить звук. Если нажать на экран во время тишины, может повториться последняя инструкция.

Сценарий Б. Полупараллельное воспроизведение (медиаконтент приостановлен)

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

Рисунок 2. Как будет направляться фокус ввода для навигационного приложения в этом полупараллельном сценарии.
  1. Пользователь запускает навигацию, когда фоновая музыка приостановлена.
  2. В периоды тишины между озвучиванием фокус ввода по умолчанию переходит на элементы управления мультимедиа.
  3. Когда навигационное приложение произносит Через 150 метров поверните налево, оно получает фокус ввода.
  4. Действия пользователя. Если нажать на экран во время воспроизведения подсказки, она может быть отключена. Если нажать на нее во время тишины, воспроизведение музыки возобновится.

Сценарий C. Одновременное воспроизведение (активный медиаконтент)

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

Рисунок 3. Как фокус ввода будет направлен в навигационное приложение в этом сценарии параллельного использования.
  1. Пользователь запускает навигацию во время воспроизведения музыки.
  2. Во время воспроизведения подсказки система приглушает фоновое аудио и переключает фокус ввода на приложение для навигации.
  3. Действия пользователя. Нажатие на экран во время озвучивания может отключить звук. Нажатие на кнопку во время тишины позволяет управлять воспроизведением (приостанавливать или возобновлять его).