Android媒体应用(三)--使用媒体会话
2017-09-20 10:19
211 查看
原文地址:https://developer.android.google.cn/guide/topics/media-apps/working-with-a-media-session.html
Media session与其管理的播放器具有相同的生命周期。你应该在拥有 media session及其关联播放器的Activity或Service的onCreate()方法中创建和初始化 media
session。
注意:编写媒体应用程序的最佳做法是使用media-compat库。在此页面上,术语“media session”是指MediaSessionCompat的实例,“media controller”表示MediaControllerCompat的实例。
新创建的media session没有功能。您必须通过执行以下步骤来初始化会话:
设置标志,以便media session可以从media controller和media buttons接收回调。
创建并初始化PlaybackStateCompat的一个实例,并将其分配给media session。播放状态在整个会话期间发生变化,因此我们建议您将PlaybackStateCompat.Builder缓存重复使用。
创建一个MediaSessionCompat.Callback的实例并将其分配给media session(更多在下面的回调)。
你应该在拥有 media session及其关联播放器的Activity或Service的onCreate()方法中创建和初始化 media session。
为了让media buttons在您的应用程序新初始化(或停止)时起作用,其播放状态必须包含与媒media buttons发送的意图相符的播放动作。这就是为什么在初始化期间将ACTION_PLAY分配给会话状态的原因。有关详细信息,请参阅响应media
buttons。
PlaybackStateCompat类描述播放器的当前操作状态。这包括:
运输状态(玩家是否播放/暂停/缓冲等)
玩家位置
可在当前状态下处理的有效控制器动作
MediaMetadataCompat类描述正在播放的资料:
艺术家,专辑和曲目的名称
轨道持续时间
专辑图片显示在锁定屏幕上。该图像是最大尺寸为320x320dp的位图(如果更大,则缩小)。
ContentUris的一个实例,指向一幅较大版本的作品
播放器状态和元数据可以在media session的整个生命周期中改变。每次状态或元数据更改时,您必须为每个类PlaybackStateCompat.Builder()或MediaMetadataCompat.Builder()使用相应的构建器,然后通过调用setPlaybackState()或setMetaData()将新实例传递到media
session。为了减少这些频繁操作的总体内存消耗,建议一次创建构建器并在会话的整个生命周期中重用它们。
在Android 5.0(API级别21)或更高版本中,系统不会在锁定屏幕上提供传输控件。相反,您应该使用MediaStyle通知来显示传输控件。
由于您在运行时(在onCreate())中实例化和设置会话的回调,您的应用程序可以定义使用不同播放器的替代回调,并根据设备和系统级别选择适当的回调/播放器组合。您可以更改播放器而不更改其余的应用程序。例如,您可以在Android 4.1(API级别16)或更高版本上运行时使用ExoPlayer,并在早期系统上使用MediaPlayer。
除了控制播放器和管理media session状态转换外,回调还可以启用和禁用应用程序的功能,并控制其与其他应用程序和设备硬件交互的方式。 (请参阅处理音频输出中的更改)。
media session回调方法的实现取决于您的应用程序的结构。请参考如何在音频应用程序和视频应用程序,详细介绍了如何为每种应用程序实现回调。
Media session与其管理的播放器具有相同的生命周期。你应该在拥有 media session及其关联播放器的Activity或Service的onCreate()方法中创建和初始化 media
session。
注意:编写媒体应用程序的最佳做法是使用media-compat库。在此页面上,术语“media session”是指MediaSessionCompat的实例,“media controller”表示MediaControllerCompat的实例。
Media session
新创建的media session没有功能。您必须通过执行以下步骤来初始化会话:设置标志,以便media session可以从media controller和media buttons接收回调。
创建并初始化PlaybackStateCompat的一个实例,并将其分配给media session。播放状态在整个会话期间发生变化,因此我们建议您将PlaybackStateCompat.Builder缓存重复使用。
创建一个MediaSessionCompat.Callback的实例并将其分配给media session(更多在下面的回调)。
你应该在拥有 media session及其关联播放器的Activity或Service的onCreate()方法中创建和初始化 media session。
为了让media buttons在您的应用程序新初始化(或停止)时起作用,其播放状态必须包含与媒media buttons发送的意图相符的播放动作。这就是为什么在初始化期间将ACTION_PLAY分配给会话状态的原因。有关详细信息,请参阅响应media
buttons。
保持播放状态和元数据
有两个表示media session状态的类。PlaybackStateCompat类描述播放器的当前操作状态。这包括:
运输状态(玩家是否播放/暂停/缓冲等)
玩家位置
可在当前状态下处理的有效控制器动作
MediaMetadataCompat类描述正在播放的资料:
艺术家,专辑和曲目的名称
轨道持续时间
专辑图片显示在锁定屏幕上。该图像是最大尺寸为320x320dp的位图(如果更大,则缩小)。
ContentUris的一个实例,指向一幅较大版本的作品
播放器状态和元数据可以在media session的整个生命周期中改变。每次状态或元数据更改时,您必须为每个类PlaybackStateCompat.Builder()或MediaMetadataCompat.Builder()使用相应的构建器,然后通过调用setPlaybackState()或setMetaData()将新实例传递到media
session。为了减少这些频繁操作的总体内存消耗,建议一次创建构建器并在会话的整个生命周期中重用它们。
Media Session锁定屏幕
从Android 4.0(API级别14)开始,系统可以访问media session的播放状态和元数据。这是锁屏后仍然可以显示媒体控件和图稿的原因。不过具体的表现形式因Android版本而异。专辑作品
在Android 4.0(API级别14)及更高版本中,锁定屏幕的背景将显示您的专辑封面,但只有当媒体会话元数据包含背景位图时。Transport controls(传输控件)
从Android 4.0(API级别14)到Android 4.4(API级别19),当media session处于活动状态并且media session元数据包含背景位图时,锁定屏幕将自动显示传输控件。在Android 5.0(API级别21)或更高版本中,系统不会在锁定屏幕上提供传输控件。相反,您应该使用MediaStyle通知来显示传输控件。
Media session回调
主要的媒体media session方法是onPlay(),onPause()和onStop()。这是您添加控制播放器的代码的位置。由于您在运行时(在onCreate())中实例化和设置会话的回调,您的应用程序可以定义使用不同播放器的替代回调,并根据设备和系统级别选择适当的回调/播放器组合。您可以更改播放器而不更改其余的应用程序。例如,您可以在Android 4.1(API级别16)或更高版本上运行时使用ExoPlayer,并在早期系统上使用MediaPlayer。
除了控制播放器和管理media session状态转换外,回调还可以启用和禁用应用程序的功能,并控制其与其他应用程序和设备硬件交互的方式。 (请参阅处理音频输出中的更改)。
media session回调方法的实现取决于您的应用程序的结构。请参考如何在音频应用程序和视频应用程序,详细介绍了如何为每种应用程序实现回调。
相关文章推荐
- Android应用中使用及实现系统“分享”功能(多个文件,多种媒体格式触发)
- Android API Guide for Media Apps(二)——媒体会话的使用(Working with a Mession)
- 如何使用Android SDK开发Android应用
- 使用intent调用Android系统自带应用
- Flash Mobile)使用Flash Builder “Burrito”开发Android应用的入门教程
- Android 系统应用调用,intent的使用总结帖(转自android专区)
- 如何使用Android SDK开发Android应用?
- 使用Junit对Android应用进行单元测试
- 使用intellij开发android应用
- Android 系统应用调用,intent 的使用总结
- Android 获取已安装应用使用的Permission
- Android 限制启动应用最大使用内存,可供极限测试时使用
- 在Android 2.3中如何使用native_activity.h编写本地应用
- Android 系统应用调用,intent的使用总结
- 使用Titanium在Android上编写Javascript应用
- EJB中JNDI的逻辑名的使用及部署_{EJB之无状态会话Bean简单应用-学习与实践}续(inber原作)
- 使用Titanium在Android上编写Javascript应用
- Window下使用android NDK开发Android应用-入门篇
- 如何使用Android SDK开发Android应用