将您的媒体应用扩展到 Android for Cars

将您的应用部署到搭载 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 中,您还可以使用 View 或 Compose 构建登录和设置界面(在停车状态下使用)。

视频应用可让用户在停车状态下观看流式视频。此类应用的核心用途是显示流式视频。这些应用是使用 View 或 Compose 构建的。如需了解详情,请参阅构建 Android Automotive OS 视频播放应用。如需了解详情,请参阅构建 Android Automotive OS 视频应用

构建车载音频播放应用

本指南假定您已经拥有基本的媒体播放应用。如果您还没有,请先参阅创建基本媒体播放器应用

本指南将为您介绍您需要做什么,包括指向具有特定指导的更多资源的链接。

播放组件

Media3 为播放用例提供了多个关键组件。如果您使用过之前的 Android 媒体库,则会熟悉构成这些组件的类。

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

由于使用 Media3 的媒体应用的不同组件共享接口和类,因此它们可以通过几种简单的方式相互关联。
图 1:媒体应用组件

如需了解详情,请参阅播放组件

实现 MediaLibraryServiceMediaLibrarySession

MediaLibraryService 提供了一个标准化 API,用于传送并允许访问您的媒体库。在向媒体应用添加对 Android Auto 或 Android Automotive OS 的支持时,必须执行此操作,因为这些平台会为您的媒体库提供自己的驱动程序安全界面。如需详细了解如何实现和使用 MediaLibraryService,请参阅使用 MediaLibraryService 传送内容

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

通过将媒体会话连接到播放器,应用可以对外通告媒体播放,并从外部来源(如 Android Auto、Android Automotive OS 或 Google 助理)接收播放命令。如需了解详情,请参阅使用 MediaSession 控制和通告播放以及使用 MediaLibrarySession

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

启用播放控件指南介绍了在汽车中自定义播放控件的方法。

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

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

声明对 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 中,依次点击 File > New > New Module
  2. 选择 Automotive Module,然后点击 Next
  3. 输入 Application/Library name。这是用户在 Android Automotive OS 上看到的应用名称。
  4. 输入 Module name
  5. 调整 Package name,使其与您的应用匹配。
  6. 针对 Minimum SDK 选择 API 28: Android 9.0 (Pie),然后点击 Next

    所有支持 Android Automotive OS 的汽车搭载的都是 Android 9(API 级别 28)或更高版本,因此选择此值能将开发目标定位到所有兼容的汽车。

  7. 选择 No Activity,然后点击 Finish

在 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 的支持。请注意,清单中未声明任何 activity。

如果您实现了设置或登录 activity,请在此处添加。这些 activity 由系统使用显式 intent 触发,并且只有它们是您要在您的 Android Automotive OS 应用的清单中声明的 activity。

添加任何设置或登录 activity 后,通过在 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>

intent 过滤器

Android Automotive OS 使用显式 intent 触发媒体应用中的 activity。请勿在清单文件中包含具有 CATEGORY_LAUNCHERACTION_MAIN intent 过滤器的任何 activity。

以下示例中的 activity 通常会将目标设备定为手机或其他移动设备。在构建手机应用的模块中声明这些 activity,而不是在构建 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"/>