android音视频指南-使用媒体会话media session
媒体会话与它所管理的播放器共存。您应该在拥有媒体会话及其关联播放器的活动或服务的onCreate()
方法中创建并初始化一个媒体会话。
注意:编写媒体应用程序的最佳实践是使用media-compat库。在本页中,术语“媒体会话”指的是MediaSessionCompat的实例,而“媒体控制器”指的是MediaControllerCompat的实例。
初始化媒体会话media session
新创建的媒体会话没有功能。您必须通过执行以下步骤来初始化会话:
- 设置标志,以便媒体会话可以接收来自媒体控制器和媒体按钮的回调。
- 创建并初始化一个
PlaybackStateCompat
实例,并将其分配给会话。回放状态会在整个会话期间发生变化,因此我们建议缓存PlaybackStateCompat.Builder
以便重用。 - 创建
MediaSessionCompat.CallBack
实例并将其分配给会话(更多关于回调的内容见下文)。
您应该在拥有会话的活动或服务的onCreate()
方法中创建和初始化一个媒体会话。
为了让媒体按钮在应用程序新初始化(或停止)时正常工作,其PlaybackState
必须包含与媒体按钮发送的意图匹配的play操作。这就是为什么ACTION_PLAY
在初始化期间被分配给会话状态。有关更多信息,请参见对媒体按钮的响应。
维护播放状态和元数据
有两个类表示媒体会话的状态。
PlaybackStateCompat
类描述了播放器的当前操作状态。这包括:
- 传输状态(播放器是否在玩/暂停/缓冲,等等。看getState())
- 适用时的错误代码和可选错误消息。(参见下面的getErrorCode()和读取状态和错误)
- 播放器的位置
- 可以在当前状态下处理的有效控制器操作
MediaMetadataCompat
类描述正在播放的材料:
- 艺术家、专辑和歌曲的名字
- 跟踪持续时间
- 相册艺术品显示在锁屏上。图像是一个最大大小为320x320dp的位图(如果较大,则按比例缩小)。
-
contenturi
的一个实例,它指向一个更大版本的艺术品
播放器状态和元数据可以在媒体会话的生命周期中发生变化。每当状态或元数据发生更改时,您必须为每个类使用相应的生成器,即PlaybackStateCompat.Builder()
或MediaMetadataCompat.Builder()
,然后通过调用setPlaybackState()或setMetaData()将新实例传递给媒体会话。为了减少这些频繁操作的总内存消耗,最好一次性创建构建器,并在会话的整个生命周期中重用它们。
状态和错误
注意,PlaybackState
是一个对象,它包含会话播放状态的单独值(getState()),必要时还包含一个关联的错误代码(getErrorCode())。错误可以是致命的,也可以是非致命的:
每当播放中断时,您应该生成一个致命错误:将传输状态设置为STATE_ERROR
,并指定与setErrorMessage(int, CharSequence)相关联的错误。只要播放被错误阻塞,PlaybackState
就应该继续报告STATE_ERROR
和错误。
当您的应用程序不能处理请求,但可以继续运行时,就会出现非致命错误:传输保持“正常”状态(比如STATE_PLAYING
),但PlaybackState
保存了一个错误代码。例如,如果最后一首歌正在播放,用户请求跳转到下一首歌,播放可以继续,但是您应该使用错误代码ERROR_CODE_END_OF_QUEUE
创建一个新的PlaybackState
,然后调用setPlaybackState()
。连接到会话的媒体控制器将接收回调onPlaybackStateChanged()并向用户解释发生了什么。非致命错误应该仅在发生时报告一次。下次会话更新时,PlaybackState
不会再次设置相同的非致命错误(除非在响应新请求时发生错误)。
媒体会话锁定屏幕
从Android 4.0 (API level 14)开始,系统可以访问媒体会话的回放状态和元数据。这是锁定屏幕如何显示媒体控件和艺术品。这种行为会因Android版本的不同而有所不同。
专辑作品
在Android 4.0 (API level 14)及更高版本中,锁定屏幕的背景会显示出你的专辑封面——但前提是媒体会话元数据包含背景位图。
传输控制
在Android 4.0 (API级别14)到Android 4.4 (API级别19)中,当媒体会话处于活动状态,且媒体会话元数据包含背景位图时,锁屏屏幕会自动显示传输控件。
在Android 5.0 (API level 21)或更高版本中,系统不提供锁定屏幕上的传输控制。相反,您应该使用MediaStyle通知来显示传输控件。
添加自定义操作
您可以使用addCustomAction()添加自定义操作。例如,添加一个控件来实现一个点赞的动作:
stateBuilder.addCustomAction(new PlaybackStateCompat.CustomAction.Builder(
CUSTOM_ACTION_THUMBS_UP, mResources.getString(R.string.thumbs_up), thumbsUpIcon)
.setExtras(customActionExtras)
.build());
有关完整示例,请参阅Universal Music Player。
您可以使用onCustomAction()来响应该操作。
@Override
public void onCustomAction(@NonNull String action, Bundle extras) {
if (CUSTOM_ACTION_THUMBS_UP.equals(action)) {
...
}
}
这里也可以参阅Universal Music Player
媒体会话回调
主媒体会话回调方法是onPlay()
、onPause()
和onStop()
。这是您添加控制播放器的代码的地方。
由于在运行时实例化并设置会话回调(在onCreate()
中),应用程序可以定义使用不同播放器的替代回调,并根据设备和/或系统级别选择适当的回调/播放器组合。你可以在不改变应用程序其余部分的情况下改变播放器。例如,你可以在Android 4.1 (API level 16)或更高版本上使用ExoPlayer,在早期的系统上使用MediaPlayer。
除了控制播放器和管理媒体会话状态转换外,回调还启用和禁用应用程序的特性,并控制它与其他应用程序和设备硬件交互的方式。(参见控制音频输出)。
媒体会话回调方法的实现取决于应用程序的结构。请参阅分别描述如何在音频应用程序和视频应用程序中使用回调的页面,描述每种应用程序的回调应该如何实现。