借助语音控制,驾驶员无需松开方向盘或移开视线即可执行任务。借助适用于汽车的与应用有关的 Action,驾驶员可以 使用 Gemini 或 Google 助理来控制其信息娱乐系统上的 Android 应用,只需 说出“Hey Google, 在 ExampleApp 上查找路边停车位”这样的语音指令即可。
与应用有关的 Action 可与 地图注点 (POI) 汽车应用配合使用。本指南介绍了将与应用有关的 Action 集成到地图注点应用的具体要求和限制。
运作方式
与应用有关的 Action 会将您的应用内功能扩展到 Gemini 或 Google 助理,让用户能够通过语音来使用应用功能。当用户调用与应用有关的 Action 时,
Gemini 或 Google 助理会将查询与应用的
shortcuts.xml资源中声明的内置 intent (BII) 进行匹配,并在请求的屏幕上启动应用。
您可以使用 Android capability 元素在应用中声明支持 BII。
当您使用 Google Play 管理中心上传应用时,Google 会注册您在应用中声明的 capability,并让用户可通过 Gemini 或 Google 助理访问这些 capability。
- 用户触发 Gemini 或 Google 助理,并针对特定应用发出语音请求。
- Gemini 或 Google 助理将请求与预训练模型 (BII) 进行匹配,并提取 BII 支持的任何参数。
- 在此示例中,Gemini 或 Google 助理会将查询与
GET_CHARGING_STATIONBII 进行匹配,提取位置参数“SFO”,然后将位置转换为 其地理坐标。 - 通过该 BII 的执行方式定义触发应用。
- 应用处理执行方式,在驾驶员的信息娱乐系统中显示充电站选项。
限制
与应用有关的 Action 的汽车实现具有以下限制:
必须使用 Android 深层链接来执行与汽车有关的 Action。如需了解与应用有关的 Action 执行方式,请参阅提供内置 intent 的执行方式详细信息。
汽车实现仅支持以下 BII:
- 停车 -
GET_PARKING_FACILITY - 充电 -
GET_CHARGING_STATION
- 停车 -
要求
如需让汽车应用支持与应用有关的 Action,请执行以下准备步骤:
确定 intent 和执行方式
借助与应用有关的 Action 为汽车应用启用语音功能,首先要确定您的应用支持哪些用户语音指令(即 intent)。 然后,您可以为每个 intent 定义一个执行方式,以指定您的应用应如何满足该请求。
您的汽车应用支持哪些 intent?
与应用有关的 Action 会提供预训练的语音模型(称为内置 intent (BII)),该模型可在用户说出 “Hey Google”时理解和解读用户的语音指令。如需响应语音请求,您只需向 Gemini 或 Google 助理声明您的应用支持的 BII。例如,如果您希望应用辅助查找停车设施,可以实现
GET_PARKING_FACILITYBII。或者,实现GET_CHARGING_STATIONBII 以帮助用户查找电动汽车充电站。您的应用应如何执行每个 intent?
应用通过将自身启动到适当的屏幕来执行语音请求。与应用有关的 Action 可为您的执行方式提供从用户请求中提取的参数,让您能够根据用户的需求来定制响应。
集成与应用有关的 Action
确定您的执行方式策略后,请按照以下步骤为汽车应用启用语音功能:
打开主 activity
AndroidManifest.xml,并声明支持 Android 快捷方式。您可以使用capability快捷方式元素向 Gemini 或 Google 助理声明您的应用支持的 BII。如需了解详情,请参阅 添加 capability。<!-- AndroidManifest.xml --> <meta-data android:name="android.app.shortcuts" android:resource="@xml/shortcuts" />接下来,将
<intent-filter>元素添加到AndroidManifest.xml。这样一来,Gemini 或 Google 助理便可以使用深层链接来连接到应用的内容。对于 Android Auto 执行方式,
<intent-filter>与您的 移动应用相同。对于 Android Automotive OS,应用的
CarAppService会话会触发 Gemini 或 Google 助理。若要允许会话触发深层链接,请在<activity>元素中指定<intent-filter>的AndroidManifest.xml。
<!-- 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文件,请创建该文件。如需了解与应用有关的 Action 如何使用 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()逻辑以处理传入的与应用有关的 Action 执行方式。以下示例展示了Session.onCreateScreen()和Session.onNewIntent()的 intent 处理。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 ... } }
Java
@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 ... } }
预览、测试和发布应用
与应用有关的 Action 提供了用于预览和测试应用的工具。如需了解此工具的相关信息,以及详细了解如何将支持语音功能的汽车应用发布到 Play 商店,请访问与应用有关的 Action 概览。