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