系统组件和用户流

下图展示了与媒体互动的组件:

系统组件

图 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。 这表示完成登录之前无法执行其他操作。