将您的媒体应用扩展到 Android Auto

将您的应用带到运行 Android Auto 或 Android Automotive OS 的车辆上。 使用适用于这两种情况的单一应用架构,以便每个用户都能享受您的应用。

什么是 Android for Cars?

汽车媒体应用可以为用户提供一种方式,让他们可以将数字生活与汽车无缝连接。通过扩展手机上相同的应用使其在汽车上可用,您可以创造更好的用户体验。您可以通过与 Android Auto 或 Android Automotive OS 集成来实现这一点。

Android 汽车应用必须首先避免驾驶员分心。您可以通过遵循最佳实践(例如使用语音命令和非常实用的视觉设计)来最大限度地减少分心。这样,您的媒体应用只有在相关时才向驾驶员显示及时信息,并为常见任务使用可预测的模式。

Android Auto

Android Auto 为拥有 Android Auto 应用和兼容汽车或售后音响系统的 Android 手机用户提供优化驾驶体验的应用体验。他们可以通过连接手机直接在汽车显示屏上使用您的应用。您可以通过创建 Android Auto 用于向驾驶员显示优化驾驶界面服务的 Android Auto 来连接您的手机应用。

Android Automotive OS

Android Automotive OS 是一个基于 Android 的信息娱乐系统,内置于车辆中。汽车系统是一个独立的 Android 设备,经过优化以用于驾驶。使用 Android Automotive OS,用户可以直接将您的应用安装到汽车上,而不是他们的手机上。

支持的应用类别

媒体应用允许用户在汽车中浏览和播放音乐、广播、有声读物和其他音频内容。更多信息,请参阅 为汽车构建音频播放应用。更多信息也可在 构建汽车媒体应用 中找到。

媒体应用使用 MediaLibraryServiceMediaSession 构建。在 Android Automotive OS 上,您还可以使用 Views 或 Compose 构建登录和设置屏幕(在停车时使用)。

视频应用允许用户在汽车停放时观看流媒体视频。这些应用的核心目的是显示流媒体视频。这些应用使用 Views 或 Compose 构建。更多信息,请参阅 为 Android Automotive OS 构建视频播放应用。更多信息可在 为 Android Automotive OS 构建视频应用 中找到。

构建汽车音频播放应用

本指南假设您已经拥有一个基本的媒体播放应用。如果您没有,要开始使用,请访问 创建基本的媒体播放器应用

本指南提供有关您需要执行的操作的信息,包括指向包含具体指导的更多资源的链接。

播放组件

Media3 提供了几个用于播放用例的关键组件。如果您使用过以前的 Android 媒体库,那么构成这些组件的类应该很熟悉。

下图演示了这些组件在一个典型应用中的组合方式。

The different components of a media app that uses Media3 connect
  together in several simple ways owing to their sharing of interfaces
   and classes.
图 1:媒体应用组件

更多信息,请参阅 播放组件

实现 MediaLibraryServiceMediaLibrarySession

MediaLibraryService 提供了一个标准化的 API 来服务和允许访问您的媒体库。在向您的媒体应用添加对 Android Auto 或 Android Automotive OS 的支持时,这是必需的,因为这些平台为您的媒体库提供了自己的安全驾驶 UI。有关实现和使用 MediaLibraryService 的更多信息,请参阅 使用 MediaLibraryService 提供内容

对于播放控件,请使用媒体会话。MediaSession API 提供了一种与音频或视频播放器交互的通用方式。Jetpack Media3 库包含 MediaLibrarySession,它扩展了 MediaSession 以添加内容浏览 API。

将媒体会话连接到播放器允许应用在外部宣传媒体播放,并从外部来源(如 Android Auto、Android Automotive OS 或 Google 助手)接收播放命令。更多信息,请参阅 使用 MediaSession 控制和宣传播放使用 MediaLibrarySession

至少,您的媒体会话应声明支持以下播放器命令

启用播放控件 指南描述了您可以在汽车中自定义播放控件的方法。

当 Android Auto 或 Android Automotive OS 连接到您的应用时,它们会请求一个要显示的内容库,这会触发 onGetLibraryRoot() 回调方法。您可以快速返回根媒体项以允许访问您的库。onGetChildren() 回调方法在 Android Auto 或 Android Automotive OS 尝试浏览内容库的更深层次时被调用。

这些平台对内容库的结构施加了额外的 限制。有关自定义内容库显示方式的详细信息,请参阅 创建媒体浏览器服务 指南。

声明对 Android Auto 的支持

使用以下清单条目声明您的手机应用支持 Android Auto

<application>
    ...
    <meta-data android:name="com.google.android.gms.car.application"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

此清单条目引用一个 XML 文件,该文件声明您的应用支持哪些汽车功能。为了表明您拥有一个媒体应用,请将名为 automotive_app_desc.xml 的 XML 文件添加到项目中的 res/xml/ 目录。此文件应包含以下内容

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

声明对 Android Automotive OS 的支持

您需要创建一个汽车模块,因为并非所有应用中的逻辑都可以与汽车应用共享。Android Automotive OS 的某些组件(例如清单)具有特定于平台的要求。创建一个模块,可以将这些组件的代码与项目中的其他代码(例如用于手机应用的代码)分开。

请按照以下步骤将汽车模块添加到您的项目中

  1. 在 Android Studio 中,单击文件 > 新建 > 新建模块
  2. 选择汽车模块,然后单击下一步
  3. 输入应用/库名称。这是用户在 Android Automotive OS 上看到的应用名称。
  4. 输入模块名称
  5. 调整包名以匹配您的应用。
  6. 最低 SDK 选择API 28:Android 9.0 (Pie),然后单击下一步

    所有支持 Android Automotive OS 的汽车都在 Android 9(API 级别 28)或更高版本上运行,因此选择此值可以定位所有兼容的汽车。

  7. 选择无 Activity,然后单击完成

在 Android Studio 中创建模块后,打开新汽车模块中的 AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

</manifest>

application 元素包含一些标准的应用信息以及一个 uses-feature 元素,该元素声明对 Android Automotive OS 的支持。请注意,清单中没有声明任何活动。

如果您实现了 设置或登录活动,请在此处添加它们。这些活动由系统使用显式意图触发,并且是您为 Android Automotive OS 应用在清单中声明的唯一活动。

添加任何设置或登录活动后,请通过在 application 元素中设置 android:appCategory="audio" 属性并添加以下 uses-feature 元素来完成清单文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.media">

    <application
        android:allowBackup="true"
        android:appCategory="audio"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme" />

    <uses-feature
        android:name="android.hardware.type.automotive"
        android:required="true" />

    <uses-feature
        android:name="android.hardware.wifi"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.portrait"
        android:required="false" />
    <uses-feature
        android:name="android.hardware.screen.landscape"
        android:required="false" />

</manifest>

将这些功能显式设置为 required="false" 可确保您的应用不会与 Automotive OS 设备中可用的硬件功能冲突。

使用以下清单条目声明您的应用支持 Android Automotive OS

<application>
    ...
    <meta-data android:name="com.android.automotive"
        android:resource="@xml/automotive_app_desc"/>
    ...
</application>

此清单条目引用一个 XML 文件,该文件声明您的应用支持的汽车功能。

为了表明您拥有一个媒体应用,请将名为 automotive_app_desc.xml 的 XML 文件添加到项目中的 res/xml/ 目录。在此文件中包含以下内容

<automotiveApp>
    <uses name="media"/>
</automotiveApp>

意图过滤器

Android Automotive OS 使用显式意图来触发媒体应用中的活动。不要在清单文件中包含任何具有 CATEGORY_LAUNCHERACTION_MAIN 意图过滤器的活动。

像以下示例中的活动一样,通常以手机或其他移动设备为目标。在构建手机应用的模块中声明这些活动,而不是在构建 Android Automotive OS 应用的模块中声明。

<activity android:name=".MyActivity">
<intent-filter>
<!-- You can't use either of these intents for Android Automotive OS -->
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
<!--
In their place, you can include other intent filters for any activities
that your app needs for Android Automotive OS, such as settings or
sign-in activities.
-->
</intent-filter>
</activity>

后续步骤

既然您有了适用于 Android Auto 和 Android Automotive OS 的应用,您可能希望采取其他步骤来优化您的应用,使其在驾驶时更安全地使用。有关更多建议,以帮助确保安全便捷的用户体验,请参阅 语音操作分心防护错误处理 的技术指南。

为 Android Automotive OS 构建视频播放应用

由于视频应用在汽车中与媒体应用分别分类,因此您需要注意视频应用的一些具体要求,如 为 Android Automotive OS 构建停放应用为 Android Automotive OS 构建视频应用 中所述。您需要使用以下说明。

将您的应用标记为视频应用

要指示您的应用支持视频,请将名为automotive_app_desc.xml的XML文件添加到项目中的res/xml/目录。在此文件中,包含以下内容

<automotiveApp>
    <uses name="video"/>
</automotiveApp>

然后,在清单文件的application元素内,添加以下引用XML文件的meta-data元素

<meta-data android:name="com.android.automotive"
    android:resource="@xml/automotive_app_desc"/>