适用于汽车的与应用有关的 Action

借助语音控制,驾驶员无需松开方向盘或移开视线即可执行任务。借助适用于汽车的与应用有关的 Action,驾驶员可以使用 Google 助理来控制其信息娱乐系统上的 Android 应用,只需说出“Ok Google, 在 ExampleApp 上查找街道停车位”这样的语音指令即可。

与应用有关的 Action 可与地图注点 (POI) 汽车应用配合使用。本指南介绍了将与应用有关的 Action 集成到地图注点应用的具体要求和限制。

了解运作方式

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

您可以使用 Android capability 元素在应用中声明支持 BII。当您使用 Google Play 管理中心上传应用时,Google 会注册您在应用中声明的 capability,并让用户可通过 Google 助理访问这些 capability。

显示汽车执行方式的图表。

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

限制

与应用有关的 Action 的汽车实现具有以下限制:

要求

如需让汽车应用支持与应用有关的 Action,请执行以下准备步骤:

  • 满足与应用有关的 Action 的一般 Android 应用要求
  • 包含汽车应用库依赖项。如需了解详情,请参阅声明依赖项

确定 intent 和执行方式

借助与应用有关的 Action 为汽车应用启用语音功能,首先要确定您的应用支持哪些用户语音指令(即 intent)。 然后,您可以为每个 intent 定义一个执行方式,以指定您的应用应如何满足该请求。

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

    与应用有关的 Action 会提供预训练的语音模型(称为内置 intent (BII)),该模型可在用户说出“Ok Google”时理解和解读用户的语音指令。如需响应语音请求,您只需向 Google 助理声明您的应用支持的 BII。例如,如果您希望应用辅助查找停车设施,可以实现 GET_PARKING_FACILITY BII。或者,实现 GET_CHARGING_STATION BII 以帮助用户查找电动汽车充电站。

  • 您的应用应如何执行每个 intent?

    应用通过将自身启动到适当的屏幕来执行语音请求。与应用有关的 Action 可为您的执行方式提供从用户请求中提取的参数,让您能够根据用户的需求来定制响应。

集成与应用有关的 Action

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

  1. 打开主 activity AndroidManifest.xml,并声明支持 Android 快捷方式。您可以使用 capability 快捷方式元素向 Google 助理声明您的应用支持的 BII。如需了解详情,请参阅添加能力 (capability)

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

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

    • 对于 Android Automotive OS,应用的 CarAppService 会话会触发 Google 助理。若要允许会话触发深层链接,请在 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. 如果您应用的 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>
    
  4. 最后,更新汽车应用的 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 概览