下图说明了与媒体互动的组件
图 1. 系统组件
下表介绍了图中的元素
组件 | 说明 |
---|---|
主屏幕 | 表示车载界面中显示和控制当前正在播放的媒体的其他界面。在 AOSP 中,这是系统启动时显示的主屏幕。在此屏幕上,用户可以查看正在播放的媒体项的详细信息,并执行一组有限的标准和自定义操作(例如,播放和暂停)。 |
系统界面 | 提供的功能包括全局界面导航选项,例如导航到媒体。 |
助理 | Android 提供了多种机制,供不同的语音助理应用与系统互动。这些应用可以在后台与媒体来源互动(例如,根据语音命令播放歌曲),或在前台导航到媒体(例如,当语音助理应用收到指示以显示特定媒体来源的界面时)。 |
应用启动器 | 所有 Android 应用都在应用启动器中启动,包括媒体来源。媒体可以呈现其自己的媒体来源选择器,以补充或取代应用启动器作为媒体的起始位置。 |
Google Play 商店 | 当使用 GAS 时,用户可以在此处在 Android 设备中查找和安装新应用。对于媒体,安装应用后,用户会被定向到媒体以完成登录过程或开始与应用互动。 |
媒体会话管理器 | Android 系统服务,用于跟踪和控制来自所有媒体来源的媒体会话。它提供了多种机制来检测媒体来源何时成为前台媒体来源。媒体和所有其他显示当前正在播放的媒体来源的应用(例如,主屏幕)都使用媒体会话管理器来检测这些事件并相应地更新界面。媒体来源通过 媒体会话 API 与媒体会话管理器互动。 |
无线电 | 用于与无线电硬件互动的专用应用。无线电搜索无线电台,快速选择最近识别的电台并在无线电频段之间切换。无线电和媒体共享的界面组件让用户可以在两种体验之间切换。 |
驾驶员分心引擎 | Android 系统服务,用于根据汽车的驾驶状态施加用户体验限制。对于媒体来源登录和设置用户体验(屏幕由媒体来源直接控制),此服务确保在汽车处于驾驶状态时不会显示不安全的内容。OEM 可以自定义这些状态的定义以及系统在这些情况下的反应方式(例如,通过显示阻止屏幕叠加层)。 |
用户流程
媒体应用启动
启动媒体的过程如下所示。
图 2. 媒体应用启动
必须使用以下隐式 CAR_INTENT_ACTION_MEDIA_TEMPLATE
启动媒体。此 intent 可以包含以下信息作为附加信息
-
android.car.intent.extra.MEDIA_COMPONENT
(可选)。字符串附加信息,用于表示MediaBrowserService
在媒体应用中的扁平化组件名称,媒体将连接到该应用。如果未提供,媒体会显示当前选定的媒体应用。此 intent 从以下入口点使用-
系统界面。用于返回媒体体验或首次开始使用媒体体验。在这种情况下,上述 Intent 将在没有任何附加信息的情况下使用,以便使媒体显示当前选定的媒体应用。
-
主屏幕、助理和通知中心。用户可以导航到媒体以显示当前选定的媒体应用。在所有情况下,都会触发不带附加信息的隐式 Intent。
-
应用启动器。当用户从应用启动器中选择媒体应用时,上述 intent 包含
CAR_EXTRA_MEDIA_COMPONENT
附加信息,其中包含选定的媒体应用。媒体将此指定为新选择的应用并连接到该应用。有关详情,请参阅下文应用启动器到媒体集成的部分。
-
应用启动器到媒体集成
不允许媒体应用提供使用 android.intent.category.LAUNCHER
类别注释的任何 Activity。因此,应用启动器(或其等效项)必须实现特殊逻辑来解决媒体来源集成问题
-
应用启动器必须扫描系统以查找实现
MediaBrowserService.SERVICE_INTERFACE
的软件包。对于这些软件包,应用启动器会提取类似于用于提取其他 Activity 的服务图标。 -
然后,应用启动器将这些软件包与实现
android.intent.category.LAUNCHER
Activity 的软件包组合在一起。如果应用提供MediaBrowserService
实现和启动器 Activity,则服务优先。截至撰写本文时,没有任何媒体来源应用可以提供启动器 Activity。
- 可以在 AOSP 代码中的
AppLauncherUtils#getAllLauncherApps()
中找到此逻辑的示例。
登录流程和配置选项
媒体应用可以包含针对车辆优化的“设置”Activity。此类 Activity 可用于实现 Android 媒体 API 未解决的用户流程,例如
- 登录
- 退出
- 帐号切换
- 显示用户当前登录到的帐号(如果有)
- 服务配置
图 3. 登录流程
此“设置”Activity 由媒体应用通过以下 intent 过滤器声明
<activity android:name=".AppSettingsActivity" android:exported="true android:theme="@style/SettingsActivity" android:label="@string/app_settings_activity_title"> <intent-filter> <action android:name="android.intent.action.APPLICATION_PREFERENCES"/> </intent-filter> </activity>
媒体必须实现以下逻辑
-
检查当前选定的媒体应用是否包含具有给定 Intent Filter 的 Activity。
-
如果是,则允许用户导航到该 Activity。
-
如果车载用户体验限制生效(例如,汽车正在行驶),则应停用此功能,因为“设置”Activity 不是驾驶员优化界面。
错误处理和必需的登录
媒体通过 Android 媒体会话 API 与媒体应用互动。作为此 API 的一部分,媒体会收到一个 PlaybackState
对象,该对象传达媒体应用的当前状态。
当媒体应用将 PlaybackState
更改为 STATE_ERROR
(包括特定的错误代码,详见下文)时,登录过程开始。发生这种情况时,媒体会显示错误描述以及用于导航到媒体应用实现的登录 Activity 的功能。
应用可以使用相同的流程来发出其他错误情况的信号(例如,服务器连接错误)。
图 4. 错误处理
作为正常 PlaybackState
错误处理的一部分,媒体必须检查以下输入。
-
PlaybackState
错误代码等于PlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED
。这表示媒体应用需要登录才能继续操作。可能会收到其他错误代码,这些代码将指示其他类型的错误情况。 -
PlaybackState
错误消息(由媒体应用使用PlaybackStateCompat.Builder#setErrorMessage
方法设置)包含人类可读的解释(例如,“您尚未登录。”)。此消息必须显示给用户,并且必须是驾驶分心优化 (DO) 的。 -
(可选)
PlaybackState
可以包含以下附加信息(由媒体应用使用PlaybackStateCompat.Builder#setExtras
方法设置),并带有以下键。-
android.media.extras.ERROR_RESOLUTION_ACTION_LABEL
。设置为一个字符串,其中包含将在用户触摸以启动登录流程的按钮上显示的人类可读消息。 -
android.media.extras.ERROR_RESOLUTION_ACTION_INTENT
。使用PendingIntent
设置,以便在用户点击上述按钮时触发。此PendingIntent
指向由同一媒体应用实现的自定义登录 Activity。
-
-
PlaybackState
状态等于STATE_ERROR
。这表示在登录完成之前,无法进行其他操作。