【Audio&Video】使用媒体会话(4)

媒体会议与其管理的玩家并存。您应该使用onCreate()拥有媒体会话及其关联播放器的活动或服务的方法创建和初始化媒体会话。

注意:编写媒体应用程序的最佳做法是使用media-compat库。在这个页面上,术语“媒体会话”意味着一个实例MediaSessionCompat,而“媒体控制器”意味着一个实例MediaControllerCompat。

初始化媒体会话


新创建的媒体会话没有功能。您必须执行以下步骤来初始化会话:

设置标志,以便媒体会话可以从媒体控制器和媒体按钮接收回传。
创建并初始化实例PlaybackStateCompat并将其分配给会话。播放状态在整个会话期间都会改变,所以我们建议缓存以PlaybackStateCompat.Builder供重用。
创建一个实例MediaSessionCompat.Callback并将其分配给会话(更多关于下面的回调)。
您应该使用拥有该会话onCreate()的活动 或服务的方法 创建和初始化媒体会话。

为了让媒体按钮在您的应用程序重新初始化(或停止)时工作,其PlaybackState媒体按钮必须包含与媒体按钮发送的意图匹配的播放操作。这就是为什么ACTION_PLAY在初始化期间分配给会话状态的原因。有关更多信息,请参阅响应媒体按钮。

保持播放状态和元数据


有两个类表示媒体会话的状态。

该 PlaybackStateCompat 课程描述玩家的当前操作状态。这包括:

运输状态(玩家是否正在玩/暂停/缓冲等getState())
适用时出现错误代码和可选错误消息。(请参阅getErrorCode()并阅读下面的州和错误。)
玩家位置
可以在当前状态下处理的有效控制器操作
该MediaMetadataCompat 课程介绍正在播放的资料:

艺术家,专辑和曲目的名称
轨道持续时间
在锁屏上显示专辑封面。该图像是一个最大尺寸为320x320dp的位图(如果较大,则缩小)。
它的一个实例ContentUris指向更大版本的艺术品

玩家状态和元数据可以在媒体会话的生命周期中改变。每次状态或元数据更改时,都必须为每个类使用相应的构建器,PlaybackStateCompat.Builder()或者MediaMetadataCompat.Builder(),然后通过调用setPlaybackState()或 将新实例传递到媒体会话 setMetaData()。为了减少这些频繁操作的整体内存消耗,最好创建一次构建器并在整个会话的整个生命周期中重用它们。

状态和错误

请注意,PlaybackState该对象包含用于会话(getState())的播放状态的单独值 ,必要时还包含关联的错误代码(getErrorCode())。错误可能是致命的或非致命的:

无论何时播放中断,您都应该生成一个致命错误:将传输状态设置为STATE_ERROR并指定相关的错误setErrorMessage(int, CharSequence)。只要播放被错误阻止,PlaybackState应继续报告STATE_ERROR和错误。

如果应用程序无法处理请求,但可以继续播放,则会发生非致命错误:传输保持“正常”状态(如STATE_PLAYING),但PlaybackState存在错误代码。例如,如果最后一首歌曲正在播放,并且用户请求跳到下一首歌曲,则可以继续播放,但您应该PlaybackState使用错误代码创建一个新歌曲,ERROR_CODE_END_OF_QUEUE然后再拨打电话setPlaybackState()。连接到会话的媒体控制器将接收回调 onPlaybackStateChanged()并向用户解释发生了什么。非致命错误应该只在发生时报告一次。下一次会话更新时,PlaybackState不要再次设置相同的非致命错误(除非响应新请求发生错误)

媒体会话锁定屏幕


从Android 4.0(API级别14)开始,系统可以访问媒体会话的播放状态和元数据。这是锁定屏幕如何显示媒体控件和艺术品。行为因Android版本而异。

专辑封面

在Android 4.0(API级别14)及更高版本中,锁定屏幕的背景会显示您的专辑图片 - 但仅当媒体会话元数据包含背景位图时才会显示。

运输控制

在Android 4.0(API级别14)至Android 4.4(API级别19)中,当媒体会话处于活动状态且媒体会话元数据包含背景位图时,锁定屏幕会自动显示传输控件。

在Android 5.0(API级别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)) {
        ...
    }
}

另请参阅环球音乐播放器。

媒体会话回调


主要媒体会话回调方法是onPlay(),onPause()和onStop()。这是你添加控制你的播放器的代码的地方。

由于您在运行时(in onCreate())实例化并设置了会话的回调,因此您的应用可以定义使用不同播放器的替代回调,并根据设备和/或系统级别选择适当的回调/播放器组合。您可以在不更改应用程序的其余部分的情况下更改播放器。例如,您可以在Android 4.1(API级别16)或更高版本上运行时使用ExoPlayer,并MediaPlayer在早期系统上使用。

除了控制播放器和管理媒体会话状态转换之外,回调还会启用和禁用应用程序的功能,并控制与其他应用程序和设备硬件交互的方式。(请参阅控制音频输出)。

媒体会话回调方法的实现取决于您的应用程序的结构。请参阅介绍如何在音频应用程序 和 视频应用程序中使用回调的单独页面,描述 应如何针对各种应用程序实现回调。

联系我

QQ:94297366
微信打赏:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ

公众号推荐:

【Audio&Video】使用媒体会话(4)

猜你喜欢

转载自blog.51cto.com/4789781/2129198