将您的应用带到运行 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 上,您还可以使用 Views 或 Compose 构建登录和设置屏幕(在停车时使用)。
视频应用允许用户在汽车停放时观看流媒体视频。这些应用的核心目的是显示流媒体视频。这些应用使用 Views 或 Compose 构建。更多信息,请参阅 为 Android Automotive OS 构建视频播放应用。更多信息可在 为 Android Automotive OS 构建视频应用 中找到。
构建汽车音频播放应用
本指南假设您已经拥有一个基本的媒体播放应用。如果您没有,要开始使用,请访问 创建基本的媒体播放器应用。
本指南提供有关您需要执行的操作的信息,包括指向包含具体指导的更多资源的链接。
播放组件
Media3 提供了几个用于播放用例的关键组件。如果您使用过以前的 Android 媒体库,那么构成这些组件的类应该很熟悉。
下图演示了这些组件在一个典型应用中的组合方式。
更多信息,请参阅 播放组件。
实现 MediaLibraryService
和 MediaLibrarySession
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()
回调方法。您可以快速返回根媒体项以允许访问您的库。onGetChildren()
回调方法在 Android Auto 或 Android Automotive OS 尝试浏览内容库的更深层次时被调用。
这些平台对内容库的结构施加了额外的 限制。有关自定义内容库显示方式的详细信息,请参阅 创建媒体浏览器服务 指南。
声明对 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 中,单击文件 > 新建 > 新建模块。
- 选择汽车模块,然后单击下一步。
- 输入应用/库名称。这是用户在 Android Automotive OS 上看到的应用名称。
- 输入模块名称。
- 调整包名以匹配您的应用。
为最低 SDK 选择API 28:Android 9.0 (Pie),然后单击下一步。
所有支持 Android Automotive OS 的汽车都在 Android 9(API 级别 28)或更高版本上运行,因此选择此值可以定位所有兼容的汽车。
选择无 Activity,然后单击完成。
在 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 的支持。请注意,清单中没有声明任何活动。
如果您实现了 设置或登录活动,请在此处添加它们。这些活动由系统使用显式意图触发,并且是您为 Android Automotive OS 应用在清单中声明的唯一活动。
添加任何设置或登录活动后,请通过在 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>
意图过滤器
Android Automotive OS 使用显式意图来触发媒体应用中的活动。不要在清单文件中包含任何具有 CATEGORY_LAUNCHER
或 ACTION_MAIN
意图过滤器的活动。
像以下示例中的活动一样,通常以手机或其他移动设备为目标。在构建手机应用的模块中声明这些活动,而不是在构建 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"/>