将您的应用部署到搭载 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,用户可直接将您的应用安装到车载系统上,而不是手机上。
支持的应用类别
媒体应用可让用户在车内浏览和播放音乐、电台、有声读物及其他音频内容。如需了解详情,请参阅 构建车载音频播放应用和 构建车载媒体应用。
媒体应用是使用 MediaLibraryService
和 MediaSession构建的。
在 Android Automotive OS 中,您还可以使用 View 或 Compose 构建登录和设置界面(在停车状态下使用)。
视频应用可让用户在停车状态下观看流式视频。此类应用的核心用途是显示流式视频。这些应用是使用 View 或 Compose 构建的。如需了解详情,请参阅 构建 Android Automotive OS 视频播放应用和 构建 Android Automotive OS 视频应用。
构建车载音频播放应用
本指南假定您已具有基本的媒体播放应用。如果没有, 请先参阅 创建基本媒体播放器应用。
本指南将为您提供所需执行操作的相关信息,包括指向包含具体指导的其他资源的链接。
播放组件
Media3 为播放用例提供了几个关键组件。如果您使用过之前的 Android 媒体库,那么您应该很熟悉构成这些组件的类。
下图展示了这些组件在典型应用中的组合方式。
如需了解详情,请参阅播放组件。
实现 MediaLibraryService 和 MediaLibrarySession
A MediaLibraryService
提供了一个标准化 API,用于提供媒体库并允许访问媒体库。
向媒体应用添加对 Android Auto 或 Android Automotive OS 的支持时,需要使用此 API,因为这些平台会为您的媒体库提供自己的驾驶员安全界面。如需详细了解如何实现和使用
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 的某些组件(如清单)有特定于平台的要求。请创建一个模块,以便将这些组件的代码与项目中的其他代码(例如用于移动应用的代码)分开。
如需在项目中添加汽车模块,请按以下步骤操作:
- 在 Android Studio 中,依次点击 File > New > New Module。
- 选择 Automotive Module,然后点击 Next。
- 输入 Application/Library name。这是用户在 Android Automotive OS 上看到的应用名称。
- 输入 Module name。
- 调整 Package name,使其与您的应用匹配。
针对 Minimum SDK 选择 API 28: Android 9.0 (Pie),然后点击 Next。
所有支持 Android Automotive OS 的汽车搭载的都是 Android 9(API 级别 28)或更高版本,因此选择此值能将开发目标定位到所有兼容的汽车。
选择 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_LAUNCHER 或 ACTION_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:appCategory="video"属性添加到清单的<application>
元素中。
<manifest ...>
...
<application
...
android:appCategory="video">
...
</application>
</manifest>
声明 Android Automotive OS 硬件功能
如需声明您的应用支持 Android Automotive OS 设备,请将
android.hardware.type.automotive <uses-feature> 元素添加到清单中。
如需了解有关是否将 android:required 属性设置为 "false" 或
"true" 的指导,请参阅
声明 AAOS 硬件功能
。
<manifest ...>
...
<uses-feature android:name="android.hardware.type.automotive" ...>
...
</manifest>