시스템 구성요소 및 사용자 흐름

다음 다이어그램은 미디어와 상호작용하는 구성요소를 보여 줍니다.

시스템 구성요소

그림 1. 시스템 구성요소

이 그림의 요소는 아래에 설명되어 있습니다.

구성요소 설명
홈 화면 현재 재생되는 미디어를 표시하고 제어하는 자동차 UI의 다른 영역을 나타냅니다. AOSP에서는 시스템이 시작될 때 표시되는 기본 화면입니다. 이 화면을 통해 사용자는 재생되는 미디어 항목의 세부정보를 확인하고 제한된 일련의 표준 작업과 맞춤 작업(예: 재생 및 일시중지)을 실행할 수 있습니다.
시스템 UI 미디어로 이동과 같은 전역 UI 탐색 옵션이 포함된 기능을 제공합니다.
어시스턴트 Android는 다양한 음성 어시스턴트 앱이 시스템과 상호작용할 수 있는 메커니즘을 제공합니다. 이러한 앱은 백그라운드에서 미디어 소스와 상호작용하거나(예: 음성 명령의 결과로 노래 재생) 포그라운드에서 미디어로 이동할 수 있습니다(예: 음성 어시스턴트 앱에 특정 미디어 소스의 UI를 표시하라고 명령할 때).
앱 런처 미디어 소스를 포함한 모든 Android 애플리케이션은 앱 런처에서 시작됩니다. 미디어는 자체 미디어 소스 선택기를 표시하여 앱 런처를 미디어의 시작 위치로 보완하거나 대체할 수 있습니다.
Google Play 스토어 GAS를 사용 중일 때 여기에서 사용자가 새 애플리케이션을 찾아 Android 기기에 설치합니다. 미디어의 경우 애플리케이션이 설치되면 사용자는 미디어로 이동하여 로그인 프로세스를 완료하거나 애플리케이션과 상호작용을 시작합니다.
미디어 세션 관리자 모든 미디어 소스의 미디어 세션을 추적하고 제어하는 Android 시스템 서비스입니다. 미디어 소스가 포그라운드 미디어 소스가 되는 시점을 감지하는 메커니즘을 제공합니다. 미디어 및 현재 재생되는 미디어 소스(예: 홈 화면)를 표시하는 다른 모든 애플리케이션은 미디어 세션 관리자를 사용하여 이러한 이벤트를 감지하고 적절하게 UI를 업데이트합니다. 미디어 소스는 Media Session API를 통해 미디어 세션 관리자와 상호작용합니다.
라디오 무선 하드웨어와 상호작용하는 특수 애플리케이션입니다. 라디오는 라디오 채널을 검색하여 최근 식별된 채널을 빠르게 선택하고 라디오 대역 간에 전환합니다. 라디오와 미디어에서 모두 공유하는 UI 구성요소를 통해 사용자는 두 환경 간에 전환할 수 있습니다.
운전자 주의 분산 행동 엔진 자동차의 운전 상태에 기반하여 UX 제한을 적용하는 데 사용되는 Android 시스템 서비스입니다. 미디어 소스 로그인과 설정 UX(미디어 소스에서 직접 화면을 제어하는 경우)의 경우 이 서비스는 자동차가 운전 상태일 때 안전하지 않은 콘텐츠가 표시되지 않도록 합니다. OEM은 이러한 상태의 정의와 시스템이 이와 같은 상황에서 반응하는 방식을 맞춤설정할 수 있습니다(예: 차단 화면 오버레이 표시).

사용자 흐름

미디어 애플리케이션 실행

미디어가 실행되는 프로세스는 아래에 나와 있습니다.

미디어 애플리케이션 실행

그림 2. 미디어 애플리케이션 실행

미디어는 다음 암시적 CAR_INTENT_ACTION_MEDIA_TEMPLATE을 사용하여 실행되어야 합니다. 이 인텐트에는 extras로 다음 정보가 포함될 수 있습니다.

  • android.car.intent.extra.MEDIA_COMPONENT(선택사항). 미디어를 연결할 미디어 애플리케이션에서 MediaBrowserService의 평면화된 구성요소 이름을 나타내는 문자열 extra입니다. 제공되지 않으면 미디어는 현재 선택된 미디어 애플리케이션을 표시합니다. 이 인텐트는 다음 진입점에서 사용됩니다.

    • 시스템 UI. 미디어 환경으로 돌아가거나 처음 사용하기 시작하는 데 사용됩니다. 이 경우 미디어에서 현재 선택된 미디어 애플리케이션을 표시하도록 하기 위해 위의 인텐트가 어떤 extras도 없이 사용됩니다.

    • 홈 화면, 어시스턴트, 알림 센터. 사용자는 미디어로 이동하여 현재 선택된 미디어 애플리케이션을 표시할 수 있습니다. 어떠한 경우든 extras가 없는 암시적 인텐트가 트리거됩니다.

    • 앱 런처. 사용자가 앱 런처에서 미디어 애플리케이션을 선택할 때 위의 인텐트에는 선택된 미디어 애플리케이션이 포함된 CAR_EXTRA_MEDIA_COMPONENT extra가 포함됩니다. 미디어는 이를 새로 선택한 애플리케이션으로 지정하고 연결합니다. 자세한 내용은 아래의 미디어 통합 관련 앱 런처 섹션을 참고하세요.

미디어 통합 관련 앱 런처

미디어 애플리케이션은 android.intent.category.LAUNCHER 카테고리로 주석이 달린 어떤 활동도 제공할 수 없습니다. 따라서 앱 런처(또는 이에 상응하는 것)는 특수 로직을 구현하여 미디어 소스 통합을 처리해야 합니다.

  • 앱 런처는 시스템에서 MediaBrowserService.SERVICE_INTERFACE를 구현하는 패키지를 검색해야 합니다. 이러한 패키지의 경우 앱 런처는 다른 활동을 가져오는 데 사용되는 것과 유사한 서비스 아이콘을 가져옵니다.

  • 그런 다음 앱 런처는 이러한 패키지를 android.intent.category.LAUNCHER 활동을 구현하는 패키지와 결합합니다. 애플리케이션이 MediaBrowserService 구현과 런처 활동을 제공하면 서비스가 우선합니다.

    이 문서 작성 시점부터 어떤 미디어 소스 애플리케이션도 런처 활동을 제공할 수 없습니다.

  • AppLauncherUtils#getAllLauncherApps().의 AOSP 코드에서 이 로직의 예를 확인할 수 있습니다.

로그인 흐름 및 구성 옵션

미디어 애플리케이션에는 차량에 최적화된 설정 활동이 포함될 수 있습니다. 이러한 활동은 Android Media API로 처리되지 않은 사용자 흐름을 구현하는 데 사용할 수 있습니다. 예를 들면 다음과 같습니다.

  • 로그인
  • 로그아웃
  • 계정 전환
  • 사용자가 현재 로그인되어 있는 디스플레이(있는 경우)
  • 서비스 구성

로그인 흐름

그림 3. 로그인 흐름

이 설정 활동은 미디어 애플리케이션에서 다음 인텐트 필터를 사용하여 선언합니다.

<activity android:name=".AppSettingsActivity"
          android:exported="true
          android:theme="@style/SettingsActivity"
           android:label="@string/app_settings_activity_title">
   <intent-filter>
       <action android:name="android.intent.action.APPLICATION_PREFERENCES"/>
   </intent-filter>
</activity>

미디어는 다음 로직을 구현해야 합니다.

  • 현재 선택된 미디어 애플리케이션에 인텐트 필터가 지정된 활동이 포함되어 있는지 확인합니다.

  • 포함되어 있다면 사용자가 활동으로 이동하도록 허용합니다.

  • 자동차 UX 제한이 적용되는 경우(예: 자동차가 움직이는 경우) 이 어포던스는 사용 중지해야 합니다. 설정 활동이 운전자 최적화 UI가 아니기 때문입니다.

오류 처리 및 필수 로그인

미디어는 Android Media Session API를 통해 미디어 애플리케이션과 상호작용합니다. 이 API의 일부로 미디어는 미디어 애플리케이션의 현재 상태를 전달하는 PlaybackState 객체를 수신합니다.

로그인 프로세스는 미디어 애플리케이션이 특정 오류 코드를 비롯하여 PlaybackStateSTATE_ERROR로 변경할 때 시작됩니다(아래 세부정보 참고). 이 경우 미디어는 오류 설명과 미디어 애플리케이션에서 구현된 로그인 활동으로 이동하기 위한 어포던스를 표시합니다.

이와 동일한 흐름을 애플리케이션에서 사용하여 다른 오류 상황(예: 서버 연결 오류)을 알릴 수 있습니다.

오류 처리

그림 4. 오류 처리

일반적인 PlaybackState 오류 처리의 일부로 미디어는 다음 입력을 확인해야 합니다.

  • PlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED와 동일한 PlaybackState 오류 코드입니다. 작업을 계속하려면 미디어 애플리케이션에 로그인이 필요하다고 알립니다. 다른 유형의 오류 상황을 나타내는 다른 오류 코드를 수신할 수도 있습니다.

  • PlaybackStateCompat.Builder#setErrorMessage 메서드를 사용하여 미디어 애플리케이션에서 설정된 PlaybackState 오류 메시지에는 사람이 읽을 수 있는 설명이 포함됩니다(예: '로그인되어 있지 않습니다'). 이 메시지는 사용자에게 표시해야 하며 운전에 방해가 되지 않도록 최적화(DO)해야 합니다. 자세한 내용은 UX 운전 제한을 참고하세요.

  • 선택적으로 PlaybackState는 다음 키와 함께 다음 extras(PlaybackStateCompat.Builder#setExtras 메서드를 사용하여 미디어 애플리케이션에서 설정)를 포함할 수 있습니다.

    • android.media.extras.ERROR_RESOLUTION_ACTION_LABEL는 사람이 읽을 수 있는 메시지가 포함된 문자열에 설정되어 사용자가 로그인 흐름을 시작하려고 터치하는 버튼에 표시됩니다.

    • android.media.extras.ERROR_RESOLUTION_ACTION_INTENTPendingIntent를 통해 설정되어 사용자가 위에 언급한 버튼을 클릭할 때 트리거됩니다. 이 PendingIntent는 동일한 미디어 애플리케이션에서 구현된 맞춤 로그인 활동을 가리킵니다.

  • PlaybackState 상태는 STATE_ERROR와 같습니다. 로그인이 완료될 때까지 다른 어떤 작업도 할 수 없다고 알립니다.