활성 VIA 선택은 CarSettings의 ManageAssistActivity
에 의해 실행됩니다. 이 흐름은 설정 화면의 기본 앱 섹션의 일부로 PackageInstaller
애플리케이션에 의해 트리거됩니다.
그림 1. 설정 화면의 기본 앱
선택된 VIA는 다음과 같은 두 가지 방법으로 시스템에 노출됩니다.
RolesManager
시스템 서비스의 일부로 노출AssistUtils
내부 API를 통해VoiceInteractionManagerService
에 의해 노출
VIA 후보 목록은 역할 이름이 android.app.role.ASSISTANT
인 RolesManager
를 사용하여 얻을 수 있습니다.
핫워드 트리거
Android는 하드웨어 DSP 위에 추상화로 AlwaysOnHotwordDetector를 제공합니다. 이를 통해 저에너지 상시 사용 설정 음성 인식을 위한 음성 모델에 VoiceInteractionService
를 간편하게 연결할 수 있습니다. 이는 사용자가 새 대화를 시작하기 위해 VA(Voice Application)와 상호작용하도록 요청하는 가장 일반적이고 잘 알려진 상호작용 흐름입니다. 이 방법으로 시작된 음성 세션은 SHOW_SOURCE_ASSIST_GESTURE flag
로 식별됩니다.
그림 2. 핫워드 트리거
범례: 시스템 서비스는 연한 파란색으로, VIA 구성요소는 녹색으로 표시됩니다.
PTT 트리거
이는 하드웨어 버튼 길게 누르기 또는 짧게 누르기에 적용됩니다. AAOS에서 PTT는 CarInputService에 의해 처리됩니다. 기본 구현에서 이 서비스는 차량 HAL을 통해 수신된 입력 이벤트를 처리하며, 특히 음성 상호작용의 경우 키 이벤트에 다음 로직을 적용합니다.
- 짧은 PTT 이벤트(
KeyEvent.KEYCODE_VOICE_ASSIST
)는VoiceInteractionManagerService
에 전달되어 새 음성 세션을 시작합니다. - 긴 PTT 이벤트는 먼저 프로젝션 수신기(예: Android Auto 또는 CarPlay)에 전달된 후 블루투스 연결 기기에 전달되고 마지막으로 로컬 VIA 애플리케이션에 전달됩니다.
이 흐름을 사용하여 시작된 세션은 SHOW_SOURCE_PUSH_TO_TALK
로 식별됩니다.
그림 3. PTT 트리거
하드웨어 음성 제어 버튼을 AAOS에 통합하려면 Automotive 키 입력 통합을 참고하세요.
탭하여 말하기 트리거(또는 소프트웨어 버튼)
시스템 UI에서 음성 상호작용을 트리거하는 것은 AssistUtil을 사용하여 실행됩니다. 이 API는 다음을 활성화하는 시스템 UI와 같은 번들 시스템 애플리케이션에서만 사용할 수 있는 숨겨진 시스템 API입니다.
VoiceInteractionManagerService
와 상호작용하여 음성 제어 세션 시작- 현재 선택된 VIA 확인
선택된 VIA 애플리케이션을 동적으로 표시하기 위해 시스템 UI는 RoleManager
를 사용하고 ROLE_ASSISTANT
의 역할 보유자에 관한 변경사항을 계속 확인할 수 있습니다. 탭하여 말하기(TTT) 트리거를 구현하는 방법의 예는 CarSystemUI, AssistantButton
에서 확인할 수 있습니다.
그림 4. 탭하여 말하기 트리거
음성 어시스턴트 탭하여 읽기(TTR)
Automotive에서INBOX
또는 INBOX_IN_GROUP
알림(예: SMS 메시지)으로 식별되며 알림 센터에 게시되는 알림에는 재생 작업 버튼이 포함됩니다. 사용자가 이 버튼을 사용하면 선택된 VIA에서 알림을 소리 내어 읽고 선택적으로 음성으로 답장할 수 있습니다.
그림 5. 알림
이 흐름을 구현하는 방법에 관한 자세한 내용은 메시지 처리 명령어를 참고하세요.
자동차 런처에서 VIA 실행
다른 애플리케이션과 마찬가지로 VIA는 매니페스트에 하나 이상의 런처 활동을 포함할 수 있습니다. 이러한 활동이 실행할 작업을 결정하는 것은 애플리케이션 개발자와 이 애플리케이션의 사전 설치를 수락하는 OEM에 달려 있습니다.
중요: Automotive에서 시스템 활동을 포함한 모든 활동의 경우 운전 중에 UX 제한이 적용됩니다. 런처 아이콘에서 사용 설정하려는 환경을 운전 중에 사용할 수 있어야 한다면 허용 목록에 추가하거나(OEM인 경우) distractionOptimized
메타데이터로 활동에 주석을 지정합니다. 자세한 내용은 운전자 주의 분산 행동 가이드라인을 참고하세요.
DSP 및 오디오 HAL
동시 캡처에서 동시 상시 사용 설정 오디오 녹음 및 오디오 HAL에 관한 업데이트된 가이드라인을 검토하시기 바랍니다. 이러한 API에 대한 액세스는 핫워드에 응답에서 설명한 것처럼 핫워드 감지 성능에 상당한 영향을 줄 수 있습니다.
권한
시스템 독점 권한 부여
사용자가 독점 권한을 부여할 수 없다는 점을 고려할 때 VIA에 독점 권한이 필요하다면 OEM은 시스템 이미지에 APK를 미리 로드하고 빌드에서 이 권한을 명시적으로 부여해야 합니다. 권한 요청을 참고하세요.
이처럼 독점 권한을 부여하려면 다음과 같이 프로젝트에 권한 허용 목록 종속 항목을 추가합니다.
Android.bp
android_app { ... required: ["privapp_allowlist_com.example.myvoicecontrol"], ... }
다음과 같이 시스템 독점 허용 목록 권한 파일을 yourdata/etc/car
폴더에 추가합니다.
vendor/…/data/etc/car/Android.bp
prebuilt_etc { name:privapp_allowlist_com.example.myvoicecontrol", sub_dir: "permissions", src: "com.example.myvoicecontrol.xml", filename_from_src: true, }
vendor/…/data/etc/car/com.example.myvoicecontrol.xml
<?xml version="1.0" encoding="utf-8"?> <permissions> <privapp-permissions package="com.android.car.voicecontrol"> <permission name="android.permission.MEDIA_CONTENT_CONTROL"/> </privapp-permissions> </permissions>
위험한 권한 사전 부여
권한 요청에 나와 있는 것처럼 VIA가 특정 기능에 액세스하려면 사용자 동의가 필요합니다. 이러한 권한 중 일부는 기본 VoiceInteractionService
에 미리 부여됩니다(DefaultPermissionGrantPolicy.java
참고). 기본 핸들러 권한에 관한 자세한 내용은 기본 핸들러에서만 사용되는 권한을 참고하세요. default-permissions.xml
구성 파일을 사용하여 권한을 미리 부여할 수도 있습니다. 권한 사전 부여와 관련된 제한사항에 관한 자세한 내용은 Android 호환성 정의 문서(CDD)의 섹션 9를 참고하세요.
중요: 모든 경우에 기본 VIA에만 이러한 권한이 미리 부여됩니다. 시스템에 VIA가 두 개 이상 미리 로드되어 있다면 기본이 아닌 VIA는 설정의 일부로 또는 처음 사용하는 동안 사용자에게 명시적으로 권한을 요청해야 합니다.
배포(업데이트 사전 설치 및 배포)
사전 설치된 VIA는 /product/priv-apps
또는 /vendor/priv-apps
파티션 및 폴더 아래에 있어야 합니다(파티션 개요와 제품 파티션 빌드에서 파티션에 관한 자세한 내용 참고).
두 번째 경우에는 공급업체 파티션이 시스템과 별도로 업데이트될 수 있다는 점을 고려할 때 여기에 호스팅되는 애플리케이션은 @hide 시스템 API에 액세스할 수 없습니다. 사전 설치된 애플리케이션의 위치에 따라 업데이트는 OTA(OTA 업데이트 참고) 또는 앱 스토어의 애플리케이션 업데이트를 통해 실행될 수 있습니다.
맞춤설정
Automotive 관련 개념에서 언급했듯이 UI/UX 일관성 및 맞춤설정은 다른 폼 팩터보다 자동차에서 더 중요합니다. 상호 운용성을 극대화하려면 AAOS 자동차 UI 라이브러리를 사용하는 것이 좋습니다. 이 라이브러리에는 OEM이 맞춤설정할 수 있도록 설계된 자동차 애플리케이션에 통합할 수 있는 구성요소 및 리소스가 포함되어 있습니다. 이 라이브러리를 사용하면 각 자동차 모델의 설계에 맞게 UI를 맞춤설정할 수 있는 방식으로 단일 APK를 빌드할 수 있습니다.