将您的媒体应用扩展到 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 上,您还可以使用视图或 Compose 构建登录和设置屏幕(在停车时使用)。

视频应用允许用户在停车时观看流媒体视频。这些应用的核心目的是显示流媒体视频。这些应用是使用视图或 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() 回调方法。您可以快速返回根媒体项目以允许访问您的库。当 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 文件,该文件声明您的应用支持的汽车功能。要表明您有一个媒体应用,请在项目的 res/xml/ 目录中添加一个名为 automotive_app_desc.xml 的 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. 选择 API 28: Android 9.0 (Pie) 作为 Minimum SDK(最低 SDK),然后点击 Next(下一步)。

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

  7. 选择 No Activity(无 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 元素包含一些标准应用信息以及声明支持 Android Automotive OS 的 uses-feature 元素。请注意,清单中未声明任何 Activity。

如果您实现设置或登录 Activity,请在此处添加它们。系统会使用显式 Intent 触发这些 Activity,并且它们是您在 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 文件,该文件声明您的应用支持的汽车功能。

要表明您有一个媒体应用,请在项目的 res/xml/ 目录中添加一个名为 automotive_app_desc.xml 的 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 视频应用中所述。您需要使用以下说明。

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

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

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

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

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