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

借助语音控制,驾驶员无需松开方向盘或移开视线即可执行任务。借助适用于汽车的与应用有关的 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。

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

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

限制

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

要求

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

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

确定 intent 和执行方式

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

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

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

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

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

集成与应用有关的 Action

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

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

     <!-- AndroidManifest.xml -->
     <meta-data
         android:name="android.app.shortcuts"
         android:resource="@xml/shortcuts" />
    
  2. 接下来,将 <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>
    
  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 概览