将您的应用部署到搭载 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
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 的某些组件(如清单)有特定于平台的要求。请创建一个模块,以便将这些组件的代码与项目中的其他代码(例如用于移动应用的代码)分开。
如需在项目中添加汽车模块,请按以下步骤操作:
- 在 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 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"/>