语音控制使驾驶员能够执行任务,而无需将手离开方向盘或将眼睛从道路上移开。借助汽车应用程序的应用操作,驾驶员可以使用 Google 助理通过说出“嘿 Google,在 ExampleApp 上查找路边停车位”之类的命令来控制其信息娱乐系统上的 Android 应用程序。
应用操作适用于 兴趣点 (POI) 汽车应用程序。本指南介绍将应用操作集成到 POI 应用程序中的特定要求和限制。
工作原理
应用操作将您的应用程序内功能扩展到助理,使用户能够使用语音访问应用程序功能。当用户调用应用操作时,助理会将查询与您应用程序的 shortcuts.xml
资源中声明的内置意图 (BII) 进行匹配,并在请求的屏幕上启动您的应用程序。
您使用 Android capability
元素在您的应用程序中声明对 BII 的支持。当您使用 Google Play 管理中心上传应用程序时,Google 会注册您应用程序中声明的功能,并使其可供用户从助理中访问。
- 用户触发助理并对特定应用程序进行语音请求。
- 助理将请求与预先训练的模型 (BII) 进行匹配,并提取 BII 支持的任何参数。
- 在本例中,助理将查询与
GET_CHARGING_STATION
BII 进行匹配,提取位置参数“SFO”,并将位置转换为其地理坐标。 - 应用程序通过其针对此 BII 的实现定义被触发。
- 应用程序处理实现,在驾驶员的信息娱乐系统中显示充电站选项。
限制
汽车中应用操作的实现具有以下限制
汽车应用操作必须使用 Android 深层链接 实现。有关应用操作实现的信息,请参阅 提供内置意图的实现详细信息。
汽车实现仅支持以下 BII
- 停车 -
GET_PARKING_FACILITY
- 充电 -
GET_CHARGING_STATION
- 停车 -
要求
执行以下步骤以准备您的汽车应用程序以使用应用操作
确定您的意图和实现
使用应用操作使汽车应用程序能够使用语音的第一步是确定您的应用程序支持哪些用户语音命令或意图。然后,您为每个意图定义一个实现,以指定您的应用程序应如何满足请求。
您的汽车应用程序支持哪些意图?
应用操作提供预先训练的语音模型,称为内置意图 (BII),它可以在用户说出“嘿 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 汽车操作系统,您应用的
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 ... } }
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 ... } }
预览、测试和发布您的应用
应用操作提供工具来预览和测试您的应用。请访问 应用操作概述,了解有关此工具的信息以及如何将您的语音支持汽车应用发布到 Play 商店的详细信息。