汽车应用操作

语音控制使驾驶员能够执行任务,而无需将手离开方向盘或将眼睛从道路上移开。借助汽车应用程序的应用操作,驾驶员可以使用 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 以帮助用户查找电动汽车充电站。

  • 您的应用程序应如何实现每个意图?

    您的应用程序通过将自身启动到相应的屏幕以实现语音请求。应用操作为您的实现提供从用户请求中提取的参数,使您能够根据用户的需求调整响应。

集成应用操作

在确定了实现策略后,请按照以下步骤使用语音启用您的汽车应用程序

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

     <!-- AndroidManifest.xml -->
     <meta-data
         android:name="android.app.shortcuts"
         android:resource="@xml/shortcuts" />
    
  2. 接下来,将 <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>
    
  3. 如果您应用的 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>
    
  4. 最后,更新您的汽车应用的 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 商店的详细信息。