음성 제어를 사용하면 운전자가 운전대에서 손을 떼거나 도로에서 눈을 떼지 않고도 작업을 실행할 수 있습니다. 자동차 앱용 앱 작업을 통해 운전자는 Google 어시스턴트를 사용하여 "Hey Google, 예시 앱에서 노상 주차장 찾아 줘"와 같이 말하여 인포테인먼트 시스템에서 Android 앱을 제어할 수 있습니다.
앱 작업은 관심 장소 자동차 앱과 호환됩니다. 이 가이드에서는 앱 작업을 관심 장소 앱에 통합하기 위한 구체적인 요구사항과 제한사항을 설명합니다.
작동 방식
앱 작업은 인앱 기능을 어시스턴트로 확장하므로 사용자가 음성으로 앱 기능에 액세스할 수 있습니다. 사용자가 앱 작업을 호출하면 어시스턴트는 쿼리를 앱의 shortcuts.xml
리소스에 선언된 내장 인텐트(BII)와 일치시킨 후 요청된 화면에서 앱을 실행합니다.
Android capability
요소를 사용하여 앱에서 BII 지원을 선언합니다.
Google Play Console을 사용하여 앱을 업로드하면 Google에서는 앱에서 선언된 기능을 등록하고 사용자가 어시스턴트에서 액세스할 수 있도록 합니다.
- 사용자가 어시스턴트를 트리거하고 음성으로 특정 앱을 요청합니다.
- 어시스턴트는 요청을 선행 학습된 모델(BII)과 일치시키고 BII에서 지원하는 모든 매개변수를 추출합니다.
- 이 예에서 어시스턴트는 쿼리를
GET_CHARGING_STATION
BII와 일치시키고 위치 매개변수 'SFO'를 추출한 후 위치를 지역 좌표로 변환합니다. - 앱은 이 BII의 처리 정의를 통해 트리거됩니다.
- 앱은 처리를 실행하여 충전소 옵션을 운전자의 인포테인먼트 시스템에 표시합니다.
제한사항
앱 작업의 자동차 구현에는 다음과 같은 제한사항이 적용됩니다.
자동차 앱 작업은 Android 딥 링크를 사용하여 처리해야 합니다. 앱 작업 처리에 관한 자세한 내용은 내장 인텐트의 처리 세부정보 제공을 참고하세요.
자동차 구현에서는 다음과 같은 BII만 지원합니다.
- 주차 -
GET_PARKING_FACILITY
- 충전 -
GET_CHARGING_STATION
- 주차 -
요구사항
다음 단계에 따라 앱 작업을 지원하는 자동차 앱을 준비하세요.
인텐트 및 처리 결정
앱 작업을 통해 자동차 앱을 음성으로 사용하도록 설정하는 첫 번째 단계는 앱에서 지원하는 사용자 음성 명령 또는 인텐트를 결정하는 것입니다. 그런 다음 각 인텐트의 처리를 정의하여 앱이 요청을 충족하는 방법을 지정합니다.
자동차 앱에서 지원하는 인텐트는 무엇인가요?
앱 작업은 내장 인텐트(BII)라고 하는 선행 학습된 음성 모델을 제공합니다. BII는 사용자가 "Hey Google"이라고 말할 때 사용자의 음성 명령을 이해하고 해석할 수 있습니다. 음성 요청에 응답하려면 앱에서 지원하는 BII를 어시스턴트에 선언하기만 하면 됩니다. 예를 들어 앱으로 주차 시설을 쉽게 찾을 수 있도록 하려면
GET_PARKING_FACILITY
BII를 구현합니다. 또는GET_CHARGING_STATION
BII를 구현하여 사용자가 전기자동차 충전소를 쉽게 찾을 수 있도록 합니다.앱에서는 각 인텐트를 어떻게 처리해야 하나요?
앱은 자체적으로 실행되어 적절한 화면을 표시함으로써 음성 요청을 처리합니다. 앱 작업은 사용자 요청에서 추출한 매개변수를 처리에 제공하므로 사용자의 요구에 맞게 응답을 조정할 수 있습니다.
앱 작업 통합
처리 전략을 결정한 후에는 다음 단계에 따라 자동차 앱을 음성으로 사용하도록 설정하세요.
기본 활동
AndroidManifest.xml
을 열고 Android 바로가기 지원을 선언합니다.capability
바로가기 요소를 사용하여 앱에서 지원하는 BII를 어시스턴트에 선언합니다. 자세한 내용은 기능 추가를 참고하세요.<!-- AndroidManifest.xml --> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />
이제
<intent-filter>
요소를AndroidManifest.xml
에 추가합니다. 이렇게 하면 어시스턴트가 딥 링크를 사용하여 앱 콘텐츠에 연결할 수 있습니다.Android Auto 처리의 경우
<intent-filter>
가 모바일 앱과 동일합니다.Android Automotive OS의 경우 앱의
CarAppService
세션이 어시스턴트를 트리거합니다. 세션이 딥 링크를 트리거하도록 허용하려면AndroidManifest.xml
의<activity>
요소에서<intent-filter>
를 지정합니다.
<!-- AndroidManifest.xml --> <activity ... android:name="androidx.car.app.activity.CarAppActivity"> ... <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="YOUR_SCHEME" android:host="YOUR_HOST" /> </intent-filter> </activity>
앱의
res/xml
디렉터리에 아직shortcuts.xml
파일이 없다면 새 파일을 만듭니다. 앱 작업에서 Android 바로가기를 사용하는 방법에 관한 자세한 내용은 shortcuts.xml 만들기를 참고하세요.shortcuts.xml
에서, 선택된 BII의capability
를 구현합니다. 그런 다음 중첩된<intent>
를 추가하여 앱 처리를 정의합니다.<!-- shortcuts.xml --> <?xml version="1.0" encoding="utf-8"?> <shortcuts xmlns:android="http://schemas.android.com/apk/res/android"> <capability android:name="actions.intent.GET_PARKING_FACILITY"> <intent> <url-template android:value="YOUR_SCHEME://YOUR_HOST{?name,address,disambiguatingDescription,latitude,longitude}"> <!-- Facility name, e.g. "Googleplex" --> <parameter android:name="parkingFacility.name" android:key="name"/> <!-- Address, e.g. "1600 Amphitheatre Pkwy, Mountain View, CA 94043" --> <parameter android:name="parkingFacility.address" android:key="address"/> <!-- Disambiguate the type of service, e.g. "valet" --> <parameter android:name="parkingFacility.disambiguatingDescription" android:key="disambiguatingDescription"/> <!-- Latitude, e.g. "37.3861" --> <parameter android:name="parkingFacility.geo.latitude" android:key="latitude"/> <!-- Longitude, e.g. "-122.084" --> <parameter android:name="parkingFacility.geo.longitude" android:key="longitude"/> </intent> </capability> </shortcuts>
이제 수신되는 앱 작업 처리를 실행하도록 자동차 앱의
Session()
로직을 업데이트합니다. 다음 샘플은Session.onCreateScreen()
및Session.onNewIntent()
의 인텐트 처리를 보여줍니다.onCreateScreen()
Kotlin
@Override fun onCreateScreen(@NonNull intent: Intent): Screen { if (intent.getData() != null) { val uri: Uri = intent.getData() // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center" // Build your Templates with parsed uri parameters ... } }
자바
@Override public Screen onCreateScreen(@NonNull Intent intent) { if (intent.getData() != null) { Uri uri = intent.getData(); // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center" // Build your Templates with parsed uri parameters ... } }
onNewIntent()
Kotlin
@Override fun onNewIntent(@NonNull intent: Intent): Screen { if (intent.getData() != null) { val uri: Uri = intent.getData() // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center" // Build your Templates with parsed uri parameters ... } }
Java
@Override public void onNewIntent(@NonNull Intent intent) { if (intent.getData() != null) { Uri uri = intent.getData(); // uri = "YOUR_SCHEME://YOUR_HOST?name=Levis%20center" // Build your Templates with parsed uri parameters ... } }
앱 미리 보기, 테스트, 게시
앱 작업은 앱을 미리 보고 테스트하는 도구를 제공합니다. 이 도구 및 음성 지원 자동차 앱을 Play 스토어에 게시하는 방법에 관한 자세한 내용은 앱 작업 개요를 참고하세요.