汽车应用操作

语音控制使驾驶员能够执行任务,而无需将手离开方向盘或视线离开道路。借助汽车应用的应用操作,驾驶员可以使用 Google 助理通过说出类似“嘿 Google,在 ExampleApp 上查找路边停车位”之类的话来控制其信息娱乐系统上的 Android 应用。

应用操作适用于 兴趣点 (POI) 汽车应用。本指南介绍了将应用操作集成到您的 POI 应用中的具体要求和限制。

工作原理

应用操作将您的应用内功能扩展到助理,使用户能够通过使用语音来访问应用功能。当用户调用应用操作时,助理会将查询与应用的 shortcuts.xml 资源中声明的内置意图 (BII) 进行匹配,并在请求的屏幕上启动您的应用。

您使用 Android capability 元素在您的应用中声明对 BII 的支持。当您使用 Google Play 控制台上传应用时,Google 会注册应用中声明的功能,并使其可供用户从助理访问。

Chart showing car fulfillment.

  1. 用户触发助理并发出特定应用的语音请求。
  2. 助理将请求与预训练模型 (BII) 进行匹配,并提取 BII 支持的任何参数。
  3. 在此示例中,助理将查询与 GET_CHARGING_STATION BII 进行匹配,提取位置参数“SFO”,并将位置转换为其地理坐标。
  4. 通过此 BII 的执行定义触发应用。
  5. 应用处理执行,在驾驶员的信息娱乐系统中显示充电站选项。

限制

汽车应用操作的实现带有以下限制

要求

执行以下步骤以准备您的汽车应用以使用应用操作

  • 满足应用操作的一般 Android 应用 要求
  • 包含汽车应用库依赖项。有关详细信息,请参阅 声明依赖项

确定您的意图和执行

使用应用操作启用汽车应用语音功能的第一步是确定您的应用支持哪些用户语音命令或意图。然后,您为每个意图定义一个执行,以指定您的应用应如何满足请求。

  • 您的汽车应用支持哪些意图?

    应用操作提供预训练的语音模型,称为内置意图 (BII),当用户说“嘿 Google”时,这些模型可以理解和解释用户的语音命令。要响应语音请求,您只需向助理声明您的应用支持的 BII 即可。例如,如果您希望您的应用协助查找停车设施,则您将实现 GET_PARKING_FACILITY BII。或者,实现 GET_CHARGING_STATION BII 以帮助用户查找电动汽车充电站。

  • 您的应用应该如何满足每个意图?

    您的应用通过启动自身到相应的屏幕来满足语音请求。App Actions 为您的执行提供从用户请求中提取的参数,使您能够根据用户的需求定制响应。

集成 App Actions

在确定执行策略后,请按照以下步骤启用汽车应用的语音功能

  1. 打开您的主活动 AndroidManifest.xml 并声明对 Android 快捷方式的支持。您可以使用 capability 快捷方式元素向 Assistant 声明您的应用支持的 BII。有关更多信息,请参阅 添加功能

     <!-- AndroidManifest.xml -->
     <meta-data
         android:name="android.app.shortcuts"
         android:resource="@xml/shortcuts" />
    
  2. 接下来,向 AndroidManifest.xml 添加 <intent-filter> 元素。这使 Assistant 可以使用深层链接连接到您的应用内容。

    • 对于 Android Auto 执行,<intent-filter> 与您的移动应用相同。

    • 对于 Android Automotive OS,您的应用的 CarAppService 会话会触发 Assistant。要允许会话触发您的深层链接,请在 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>
    
  3. 如果您还没有 shortcuts.xml 文件在您的应用的 res/xml 目录中,请创建一个新的文件。有关 App Actions 如何使用 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>
    
  4. 最后,更新您的汽车应用的 Session() 逻辑以处理传入的 App Actions 执行。以下示例演示了 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
     ...
    }
    }

预览、测试和发布您的应用

App Actions 提供了预览和测试您的应用的工具。访问 App Actions 概述 以获取有关此工具的信息,以及有关如何将您的语音启用汽车应用发布到 Play 商店的详细信息。