翻译自Using a media sessionhtml
媒体会话与它所管理的播放器共存。您应该在拥有媒体会话及其关联播放器的活动或服务的onCreate()
方法中建立并初始化一个媒体会话。java
注意:编写媒体应用程序的最佳实践是使用media-compat库。在本页中,术语“媒体会话”指的是MediaSessionCompat的实例,而“媒体控制器”指的是MediaControllerCompat的实例。android
新建立的媒体会话没有功能。您必须经过执行如下步骤来初始化会话:git
PlaybackStateCompat
实例,并将其分配给会话。播放状态会在整个会话期间发生变化,所以咱们建议缓存PlaybackStateCompat.Builder
以便重用。MediaSessionCompat.CallBack
实例并将其分配给会话(更多关于回调的内容见下文)。您应该在拥有会话的活动或服务的onCreate()
方法中建立和初始化一个媒体会话。github
为了让媒体按钮在应用程序新初始化(或中止)时正常工做,其PlaybackState
必须包含与媒体按钮发送的意图匹配的play操做。这就是为何ACTION_PLAY
在初始化期间被分配给会话状态。有关更多信息,请参见对媒体按钮的响应。缓存
有两个类表示媒体会话的状态。bash
PlaybackStateCompat
类描述了播放器的当前操做状态。这包括:session
MediaMetadataCompat
类描述正在播放的材料:app
contenturi
的一个实例,它指向一个更大版本的艺术品播放器状态和元数据能够在媒体会话的生命周期中发生变化。每当状态或元数据发生更改时,您必须为每一个类使用相应的生成器,即PlaybackStateCompat.Builder()
或MediaMetadataCompat.Builder()
,而后经过调用setPlaybackState()或setMetaData()将新实例传递给媒体会话。为了减小这些频繁操做的总内存消耗,最好一次性建立构建器,并在会话的整个生命周期中重用它们。ide
注意,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。
除了控制播放器和管理媒体会话状态转换外,回调还启用和禁用应用程序的特性,并控制它与其余应用程序和设备硬件交互的方式。(参见控制音频输出)。
媒体会话回调方法的实现取决于应用程序的结构。请参阅分别描述如何在音频应用程序和视频应用程序中使用回调的页面,描述每种应用程序的回调应该如何实现。