系统组件和用户流

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

系统组件

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