오디오 글라스의 물리적 입력 라우팅 이해하기

적용 가능한 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()
        }
    }

동시 실행 상태에서 입력 포커스가 어떻게 이동하는지 이해하기

입력 포커스를 받는 앱을 결정하기 위해 시스템은 활성 데이터 스트림을 평가하고 다음 동시 실행 상태에 따라 입력을 라우팅합니다.

동시 실행 상태 환경 컨텍스트 시스템 동작 및 입력 포커스 예

비동시

독립형 프로젝션 활동이 활성 상태이며 백그라운드 미디어 세션이 실행되고 있지 않습니다.

입력 포커스는 읽기 사이의 무음 기간에도 투사된 활동으로 완전히 라우팅됩니다.

사용자가 운동 추적 앱을 실행합니다. 소리가 나지 않는 순간에도 터치패드 입력은 피트니스 앱으로 직접 라우팅됩니다.

반동시

투사된 활동이 활성 상태이지만 백그라운드 미디어 세션이 일시중지 상태로 존재합니다.

입력 포커스는 앱의 활성 읽기 사이의 무음 기간에 일시중지된 미디어 컨트롤로 기본 설정됩니다.

사용자가 음악이 일시중지된 상태에서 운동 추적 앱을 실행합니다. 피트니스 코치 업데이트 사이에 터치패드를 탭하면 운동 기능이 트리거되는 대신 음악이 다시 시작됩니다.

동시 실행

이중 재생이 활성화되어 있습니다 (예: 앱의 오디오 안내가 배경 음악을 중단하거나 덕킹함).

오디오 포커스는 입력 포커스와 같습니다.

입력 포커스는 활성 읽기 중에 투사된 활동으로 라우팅되고 오디오 스트림이 종료되면 미디어 컨트롤로 되돌아갑니다.

사용자가 음악을 듣고 있을 때 내비게이션 앱이 안내를 읽어줍니다. 읽는 동안 내비게이션 앱이 입력 포커스를 받습니다. 읽기가 완료되면 입력 포커스가 미디어 컨트롤로 다시 이동합니다.

시스템 타이밍 보호 장치

시스템은 사용자의 우발적인 입력이나 예상치 못한 동작을 방지하기 위해 다음과 같은 보호 장치를 제공합니다.

  • 새로 실행된 프로젝션된 활동의 유예 기간: 콜드 스타트 애셋 로드 또는 네트워크 지연을 수용하기 위해 새로 실행된 프로젝션된 활동에는 시스템이 프로젝션된 활동을 중지하고 백그라운드로 이동하기 전에 데이터 스트림을 설정하고 사용자 인식을 확보할 수 있는 짧은 유예 기간이 주어집니다.
  • 사용자 인식에 따라 포커스가 라우팅됨: 오디오 판독과 같은 새로운 활성 데이터 스트림에서 사용자 인식이 변경되면 시스템은 즉시 투사된 활동을 재개하고 입력 포커스를 이 활동으로 라우팅합니다.
  • 미디어 재생 중 전환 버퍼: 백그라운드 미디어 재생 중에 일시적인 판독이 완료되면 입력 포커스가 잠시 동안 투사된 활동에 유지됩니다. 버퍼 기간은 사용자가 읽기 기능을 음소거하려고 시도하지만 대신 음악 트랙을 건너뛰는 것과 같은 우발적인 입력을 방지하는 데 도움이 됩니다. 전환 버퍼가 끝나면 시스템은 앱의 투사된 활동을 중지하고 입력 포커스를 미디어 컨트롤로 라우팅합니다.
  • 유휴 상태의 투사된 활동이 중지되거나 일시중지됨: 시스템은 몇 분 후 활성 데이터 스트림이 없는 유휴 상태의 투사된 활동을 중지합니다(또는 일시중지된 경우 진행 중인 미디어 출력에 대해 일시적으로 중지).

실제 입력 포커스 전환

동시 실행 상태에서 입력 포커스가 전환되는 방식을 이해하려면 세부 경로 안내를 제공하는 내비게이션 앱의 다음 예시 시나리오를 참고하세요.

시나리오 A: 비동시 (비활성 미디어)

이 시나리오에서는 시스템이 입력을 탐색 앱으로 라우팅하며, 탐색 앱은 전체 여정 동안 사용자 인식을 유지합니다.

그림 1. 이 비동시 시나리오에서 내비게이션 앱에 입력 포커스가 라우팅되는 방식
  1. 사용자가 백그라운드 음악을 재생하지 않고 내비게이션을 실행합니다.
  2. 내비게이션 앱이 오디오 글라스에서 프로젝션된 활동을 실행합니다.
  3. 활성 상태인 미디어 세션이 없으므로 내비게이션 앱은 이동하는 동안 터치패드 입력 포커스를 유지합니다.
  4. 사용자 작업: 활성 읽기 중에 탭하면 안내가 음소거될 수 있습니다. 침묵 중에 탭하면 마지막 안내가 반복될 수 있습니다.

시나리오 B: 준동시 (일시중지된 미디어)

이 시나리오에서는 내비게이션 앱에 사용자 인식이 없을 때마다 시스템이 입력을 시스템 미디어 컨트롤로 라우팅합니다.

그림 2. 이러한 반동시 시나리오에서 내비게이션 앱에 입력 포커스가 라우팅되는 방식
  1. 배경 음악이 일시중지된 상태에서 사용자가 내비게이션을 실행합니다.
  2. 읽기 사이의 무음 기간에는 입력 포커스가 기본적으로 미디어 컨트롤로 설정됩니다.
  3. 내비게이션 앱이 "500피트 앞에서 좌회전하세요"라고 말하면 입력 포커스를 얻습니다.
  4. 사용자 작업: 읽어주는 중에 탭하면 안내가 음소거될 수 있습니다. 무음 중에 탭하면 음악 재생이 재개됩니다.

시나리오 C: 동시 (활성 미디어)

이 시나리오의 경우 시스템은 내비게이션 앱에 사용자 인식이 없을 때마다 입력을 시스템 미디어 컨트롤로 라우팅하고, 내비게이션 앱에서 각 판독 중에 활성 미디어 재생의 오디오가 더킹됩니다.

그림 3. 이 동시 시나리오에서 내비게이션 앱에 입력 포커스가 라우팅되는 방식
  1. 음악이 재생되는 동안 사용자가 내비게이션을 실행합니다.
  2. 안내를 읽는 동안 시스템은 백그라운드 오디오를 더킹하고 입력 포커스를 내비게이션 앱으로 전환합니다.
  3. 사용자 작업: 읽어주는 중에 탭하면 안내가 음소거될 수 있습니다. 무음 기간에 탭하면 미디어 재생을 제어합니다 (일시중지 또는 다시 시작).