下图展示了与媒体互动的组件。
图 1. 系统组件
此图中的元素如下表所述:
组件 | 说明 |
---|---|
主屏幕 | 表示车载设备界面中的其他界面,用于显示和控制当前播放的媒体。在 AOSP 中,指系统启动时显示的主屏幕。在此屏幕中,用户可以查看正在播放的媒体内容的详细信息,并执行部分标准和自定义操作(例如,播放和暂停)。 |
系统界面 | 提供包含全局界面导航选项的功能,例如转到媒体。 |
助理 | Android 为不同的语音助理应用提供了与系统进行互动的机制。这些应用可以与后台的媒体来源进行互动(例如,根据语音指令播放歌曲),也可以导航至前台的媒体(例如,语音助理应用根据指令播放特定媒体来源的界面)。 |
应用启动器 | 所有 Android 应用(包括媒体来源)都是从应用启动器启动的。媒体可以显示自己的媒体来源选择器,从而补充或取代作为媒体启动位置的应用启动器。 |
Google Play 商店 | 使用 GAS 时,用户可以在 Google Play 商店中找到新应用并将其安装在 Android 设备中。对于媒体,应用安装后,用户会被定向到媒体以完成登录过程或开始与应用互动。 |
媒体会话管理器 | Android 系统服务,可跟踪和控制来自所有媒体来源的媒体会话。它提供各种机制,用于检测媒体来源成为前台媒体来源的时间。媒体和显示当前正在播放的媒体来源的所有其他应用(例如主屏幕)均使用媒体会话管理器检测这些事件,并相应地更新界面。媒体来源通过 Media 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
类别进行注解的 activity。因此,应用启动器(或其等效项)必须实现特殊逻辑以处理媒体源集成:
-
应用启动器必须扫描系统以寻找实现
MediaBrowserService.SERVICE_INTERFACE
的软件包。对于这些软件包,应用启动器会提取与用于提取其他 activity 的服务图标类似的服务图标。 -
然后,应用启动器会将这些软件包与实现
android.intent.category.LAUNCHER
activity 的软件包组合。如果应用提供MediaBrowserService
实现和启动器 activity,那么相应服务会优先。截止本文撰写时,没有任何媒体来源应用可以提供启动器 activity。
- 此逻辑的示例可以在
AppLauncherUtils#getAllLauncherApps()
中的 AOSP 代码中找到。
登录流程和配置选项
媒体应用可以包含车辆优化设置 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。
-
如果车载设备用户体验限制生效(例如汽车正在移动),应停用此功能,因为设置 activity 不是驾驶员优化界面。
错误处理和所需登录
媒体通过 Android Media Session API 与媒体应用进行互动。作为此 API 的一部分,媒体会接收 PlaybackState
对象,该对象将传达媒体应用的当前状态。
当媒体应用将 PlaybackState
更改为 STATE_ERROR
(包括具体的错误代码,详见下文)时,登录流程便会启动。发生这种情况时,媒体会显示错误说明和一种用于导航至媒体应用实现的登录 activity 的方式。
应用可以使用同一流程指示其他错误情况(例如,服务器连接错误)。
图 4. 错误处理
作为正常的 PlaybackState
错误处理的一部分,媒体必须检查以下输入。
-
PlaybackState
错误代码等同于PlaybackStateCompat#ERROR_CODE_AUTHENTICATION_EXPIRED
。这表示媒体应用要求必须登录才能继续操作。另外,也可能收到其他错误代码,指示其他类型的错误情况。 -
PlaybackState
错误消息(由媒体应用使用PlaybackStateCompat.Builder#setErrorMessage
方法设置)包含简单易懂的说明(例如“您未登录。”)。此消息必须向用户显示,并且必须j经过驾驶员防分心优化 (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
。这表示完成登录之前无法执行其他操作。