In this document
- Player and UI
- Media session and media controller
- Video apps versus audio apps
- Media apps and the Android audio infrastructure
- The media-compat library
- Measuring performance
Player and UI
播放音频或视频的多媒体应用通常有两个部分:
- 一个接收多媒体数据,通过视频/音频展示出来的播放器
- 一个通过 transport controls 运行播放器,并可以选择性地显示播放器状态的 UI 界面
在 Android 系统中,你可以从头创建自己的播放器,亦或者你可以从下面的条目中选择 :
- MediaPlayer 类给一个简单的播放器(支持大部分常见的音/视频格式和数据源)提供了最基本的功能
- ExoPlayer 是一个公开低版本 Android audio api 的开源库。ExoPlayer 提供了支持类似于 DASH 和 HLS 这种在 MediaPlayer 中不可用的流的高性能特征。你也可以重构 ExoPlayer 的代码,使得它更易于添加新的功能。ExoPlayer 只能被用于 Android 4.1 及更高版本中。
Media session and media controller
虽然 UI 和 播放器 的 API 可以使任意的,但是对于所有的多媒体播放app而言他们的交互在本质上基本相同。Android framework 定义了两个类:media session 和 media controller,这两个类为 媒体播放器app 提供了一套完善的播放器框架。
媒体会话和媒体控制器使用与标准播放器操作(播放,暂停,停止等)相对应的预定义回调来进行相互通信,以及用于定义特定于您的应用的特殊行为的可扩展自定义调用。
Media session
media session 负责与播放器的所有通信。它隐藏了播放器的 API 从而使得这部分对于 app 的其他模块不可见。播放器仅可以被控制着它的 media session 所调用。
media session 维护了一个代表着播放器状态(播放/暂停)的引用以及维护了当前正在播放的音/视频的信息。一个 media session 可以接收一个或者多个 media controller 的调用。这个特性使得你的播放器被你的 app 包括正在运行着的其他 Android 设备(Android Wear and Android Auto) 一起控制成为可能。
Media controller
media controller 将 UI 隔离开来。 UI 的代码只与 media controller 通信,而不是播放器本身。 media controller 将 transport control 操作转换为 media session 的回调。 当 media session 的状态(播放器状态)改变时,media controller 也接收来自 media session 的回调。 以上提供了一种自动更新相关 UI 的机制。 media controller 一次只能连接到一个 media session 。
当您使用 media controller 和 media session 时,您可以在运行时部署不同的接口和/或播放器。 您可以根据所运行设备的功能,独立更改应用的外观和/或性能。
Video apps versus audio apps
在播放视频时,你的眼睛和耳朵都被占用了。 播放音频时,您正在收听,但您也可以同时使用其他应用程序。 每个用例都有不同的设计。
Video app
视频应用程序需要一个查看内容的窗口。 出于这个原因,视频应用程序通常会实现一个单独的 Activity 。 显示视频的屏幕是 Activity 的一部分。
Audio app
音频播放器并不总是需要可见的UI。 一旦开始播放音频,播放器可以作为后台任务继续运行。 用户可以切换到另一个应用程序,一边工作一边收听。
要在Android中实现此设计,您可以使用两个组件构建一个音频应用程序:用于展示UI的 Activity 和 维护播放器的 Service 。 如果用户切换到另一个应用程序,该 Service 可以在后台运行。 通过将音频应用程序的两个部分分解为单独的组件,每个组件可以更有效地运行。 与播放器相比,UI通常是”短寿命”的,而播放器可以在没有UI的情况下运行很长时间。
支持库提供了两个类来实现这种客户端/服务器方法:MediaBrowserService 和 MediaBrowser。 service 组件被实现为MediaBrowserService的一个子类,包含 media session 及其播放器。 activity 和 media controller 的应该维护一个用于和 MediaBrowserService 进行通信 MediaBrowser 。
使用 MediaBrowserService 可以让配套设备(如Android Auto和Wear)轻松发现您的应用,连接到它,浏览内容并控制,而无需访问您的 activity 。
Media apps and the Android audio infrastructure
一个设计良好的媒体应用程序应该与其他播放音频的应用程序“一起和谐共处”。 它应该准备共享手机,并与您的设备上使用音频的其他应用程序合作。 它也应该响应设备上的硬件控制。
所有这些行为在 Handling Changes in Audio Output 中都有描述。
The media-compat library
media-compat 库包含有助于构建播放音频和视频的应用程序的类。 这些类与运行Android 2.3(API级别9)及更高版本的设备兼容。 他们还与其他Android功能一起工作,以创建舒适,熟悉的Android体验。
media sessions 和 media controllers 的推荐实现类是media-compat 支持库中定义的MediaSessionCompat 和 MediaControllerCompat 。 它们替代Android 5.0(API级别21)中引入的MediaSession 和 MediaController 类的早期版本。 compat 类提供相同的功能,但更容易开发你的应用程序,因为你只需要写一次 API 。 该库通过将媒体会话方法转换为旧版平台版本上的等效方法(可用时)来保持向后兼容性。
如果您已经有一个使用旧类的工作应用程序,我们建议更新到 compat 类。 当您使用 compat 版本时,您可以删除所有对 registerMediaButtonReceiver()的调用以及 RemoteControlClient .
Measuring performance
在Android 8.0(API级别26)及更高版本中,getMetrics()方法适用于某些媒体类。 它返回一个包含配置和性能信息的Bundle对象,表示为属性(键)和值的映射 – map。 getMetrics()方法是为这些媒体类定义的:
Metrics 是为每个实例分别收集的,并在实例的整个生命周期内保持不变。 如果没有 metrics 可用,则该方法返回null。 返回的实际 metrics 取决于获取它的类。
Additional code samples
要下载演示此页面上使用的API的示例,请参阅 Android ScreenCapture。