下图说明了与媒体交互的组件:
图 1.系统组件
该图中的元素在表中进行了描述:
成分 | 描述 |
---|---|
主屏幕 | 表示汽车 UI 中显示和控制当前播放媒体的其他表面。在 AOSP 中,这是系统启动时显示的主屏幕。从此屏幕上,用户可以查看正在播放的媒体项目的详细信息,并执行一组有限的标准和自定义操作(例如,播放和暂停)。 |
系统界面 | 提供包括全局 UI 导航选项的功能,例如导航到媒体。 |
助理 | Android 为不同的语音助手应用程序提供了与系统交互的机制。这些应用程序可以在后台与媒体源交互(例如,通过语音命令播放歌曲),或导航到前台的媒体(例如,当指示语音助手应用程序显示某个应用程序的 UI 时)。特定媒体源)。 |
应用程序启动器 | 所有 Android 应用程序都在应用程序启动器中启动,包括媒体源。媒体可以呈现自己的媒体源选择器,补充或替换应用程序启动器作为媒体的起始位置。 |
谷歌应用商店 | 使用 GAS 时,用户可以在 Android 设备中查找并安装新应用程序。对于媒体,安装应用程序后,用户将被定向到媒体以完成登录过程或开始与应用程序交互。 |
媒体会议经理 | Android 系统服务,跟踪和控制来自所有媒体源的媒体会话。它提供了检测媒体源何时成为前台媒体源的机制。媒体以及显示当前正在播放的媒体源(例如主屏幕)的所有其他应用程序,使用媒体会话管理器来检测这些事件并相应地更新 UI。媒体源通过媒体会话API与媒体会话管理器交互。 |
收音机 | 与无线电硬件交互的专用应用程序。无线电搜索广播电台,快速选择最近识别的电台并在无线电频段之间切换。广播和媒体共享的 UI 组件使用户能够在两种体验之间切换。 |
驾驶员分心引擎 | Android系统服务用于根据汽车的行驶状态施加UX限制。对于媒体源登录和设置UX(屏幕由媒体源直接控制),该服务可确保汽车在行驶状态下不会显示不安全的内容。 OEM 可以自定义这些状态的定义以及系统在这些情况下的反应方式(例如,通过显示阻塞屏幕覆盖)。 |
用户流量
媒体应用程序启动
启动 Media 的过程如下所示。
图 2.媒体应用程序启动
必须使用以下隐式CAR_INTENT_ACTION_MEDIA_TEMPLATE
启动媒体。此意图可以包含以下信息作为附加信息:
android.car.intent.extra.MEDIA_COMPONENT
(可选)。用于表示媒体要连接的媒体应用程序中MediaBrowserService
的扁平化组件名称的字符串。如果未提供,媒体将显示当前选择的媒体应用程序。从以下入口点使用此意图:系统用户界面。用于返回媒体体验或首次开始使用它。在这种情况下,将使用上述 Intent,无需任何额外操作,以使 Media 显示当前选择的媒体应用程序。
主屏幕、助手和通知中心。用户可以导航到媒体以显示当前选择的媒体应用程序。在所有情况下,都会触发没有额外内容的隐式 Intent。
应用程序启动器。当用户从应用程序启动器中选择媒体应用程序时,上述意图包括
CAR_EXTRA_MEDIA_COMPONENT
额外内容,其中包含所选的媒体应用程序。媒体将其指定为新选择的应用程序并连接到它。有关详细信息,请参阅下面的“应用程序启动器到媒体集成”部分。
应用程序启动器到媒体集成
媒体应用程序不允许提供任何带有android.intent.category.LAUNCHER
类别注释的活动。因此,应用程序启动器(或其等效物)必须实现特殊逻辑来解决媒体源集成问题:
应用程序启动器必须扫描系统以查找实现
MediaBrowserService.SERVICE_INTERFACE
包。对于这些包,应用程序启动器会获取类似于用于获取其他活动的服务图标。然后,应用程序启动器将这些包与实现
android.intent.category.LAUNCHER
活动的包组合起来。如果应用程序提供MediaBrowserService
实现和启动器活动,则该服务优先。截至撰写本文时,没有任何媒体源应用程序可以提供启动器活动。
- 此逻辑的示例可以在
AppLauncherUtils#getAllLauncherApps()
的 AOSP 代码中找到。
登录流程和配置选项
媒体应用程序可以包含针对车辆优化的设置活动。此类活动可用于实现 Android Media API 未处理的用户流,例如:
- 登入
- 登出
- 账户切换
- 显示用户当前登录的位置(如果有)
- 服务配置
图 3.登录流程
此设置活动由媒体应用程序使用以下意图过滤器声明:
<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>
媒体必须实现以下逻辑:
检查当前选择的媒体应用程序是否包含具有给定意图过滤器的活动。
如果是这样,请允许用户导航到该活动。
如果汽车用户体验限制有效(例如,汽车正在移动),则应禁用此功能,因为“设置”活动不是“驱动程序优化 UI”。
错误处理和所需登录
媒体通过 Android Media Session API 与媒体应用程序进行交互。作为此 API 的一部分,Media 接收一个PlaybackState
对象,该对象传达媒体应用程序的当前状态。
当媒体应用将PlaybackState
更改为STATE_ERROR
时,登录过程开始,包括特定的错误代码(请参阅下面的详细信息)。发生这种情况时,媒体会显示错误描述以及导航到媒体应用程序实现的登录活动的功能。
应用程序可以使用相同的流程来发出其他错误情况的信号(例如,服务器连接错误)。
图 4.错误处理
作为正常PlaybackState
错误处理的一部分,Media 必须检查以下输入。
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
指向由同一媒体应用程序实现的自定义登录活动。
PlaybackState
状态等于STATE_ERROR
。这表示在登录完成之前无法进行其他操作。