将您的媒体应用扩展到 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"/>