允许与媒体控制器、音量键、媒体按钮和传输控件进行交互。
当应用程序想要发布媒体回放信息或处理媒体键时,应该创建MediaSession。一般来说,一个应用程序只需要一个会话来进行所有的播放,尽管可以创建多个会话来提供更精细的媒体控制。
一旦创建了会话,会话的所有者可以将其会话令牌传递给其他进程,以允许它们创建一个MediaControllerCompat来与会话交互。
为了接收命令、媒体键和其他事件, MediaSessionCompat.Callback必须被设置,通过setCallback(Callback)
当一个应用程序完成播放时,它必须调用release()来清理会话并通知任何控制器。
MediaSessionCompat对象不是线程安全的,所有调用都应该来自同一个线程。
这是在API级别4之后以向后兼容的方式引入的一个访问MediaSession特性的助手。
Constants
ACTION_FLAG_AS_INAPPROPRIATE
预定义的自定义动作,将当前播放的媒体标记为不适当的。
ACTION_FOLLOW
预定义的自定义动作跟随艺术家,专辑,或播放列表。额外的bundle必须有ARGUMENT_MEDIA_ATTRIBUTE来指示follow操作的类型。这个bundle还可以有一个可选的字符串参数ARGUMENT_MEDIA_ATTRIBUTE_VALUE,用来指定要追随的目标(例如,要追随的艺术家的名字)。如果省略此参数,则当前播放的媒体将成为操作的目标。因此,会话必须对当前元数据执行以下操作。如果当前元数据中没有指定的属性,则控制器不能忽略该参数。
ACTION_SKIP_AD
预定义的自定义动作跳过广告,目前正在播放。
ACTION_UNFOLLOW
预定义的自定义动作取消跟踪艺术家,专辑,或播放列表。额外的bundle必须有ARGUMENT_MEDIA_ATTRIBUTE来指示unfollow操作的类型。bundle还可以有一个可选的字符串参数ARGUMENT_MEDIA_ATTRIBUTE_VALUE,用来指定要取消follow的目标(例如,要取消follow的艺术家的名字)。如果省略此参数,则当前播放的媒体将成为操作的目标。因此,会话必须对当前元数据执行unfollow操作。如果当前元数据中没有指定的属性,则控制器不能忽略该参数。
ARGUMENT_MEDIA_ATTRIBUTE
参数来指示媒体属性。它应该是以下其中之一:
ARGUMENT_MEDIA_ATTRIBUTE_VALUE
字符串参数,表示媒体属性的值(例如,艺术家的名字)。
FLAG_HANDLES_MEDIA_BUTTONS
在会话上设置此标志以指示它可以处理媒体按钮事件。废弃了
FLAG_HANDLES_QUEUE_COMMANDS
在会话上设置此标志,以指示它通过其MediaSessionCompat.Callback处理队列管理命令。
FLAG_HANDLES_TRANSPORT_CONTROLS
在会话上设置这个标志来指示它通过它的MediaSessionCompat.Callback来处理传输控制命令。废弃
MEDIA_ATTRIBUTE_ALBUM
ARGUMENT_MEDIA_ATTRIBUTE的值,表示专辑。
MEDIA_ATTRIBUTE_ARTIST
ARGUMENT_MEDIA_ATTRIBUTE的值表示艺术家。
MEDIA_ATTRIBUTE_PLAYLIST
ARGUMENT_MEDIA_ATTRIBUTE的值指示播放列表。
Public constructors
public MediaSessionCompat (Context context, String tag)
public MediaSessionCompat (Context context,
String tag,
ComponentName mbrComponent,
PendingIntent mbrIntent)
public MediaSessionCompat (Context context,
String tag,
ComponentName mbrComponent,
PendingIntent mbrIntent,
Bundle sessionInfo)
Public methods
addOnActiveChangeListener
public void addOnActiveChangeListener (MediaSessionCompat.OnActiveChangeListener listener)
添加一个侦听器,当会话的活动状态改变时,将通知该侦听器。这主要是由支持库使用,应用程序不应该需要。
fromMediaSession
public static MediaSessionCompat fromMediaSession (Context context, Object mediaSession)
从框架MediaSession对象创建一个实例。
此方法仅支持API 21+。在API 20及以下,它返回null。
注意:从这个方法返回的MediaSessionCompat对象可能不会提供MediaSessionCompat的全部功能,直到设置一个新的MediaSessionCompat. callback。为了避免这种情况,当需要一个MediaSessionCompat和一个框架MediaSession时,建议首先创建一个MediaSessionCompat,然后通过getMediaSession()获得框架会话。
getController
public MediaControllerCompat getController ()
获取此会话的控制器。这是一种方便的方法,可以避免在进程中缓存自己的控制器。
getCurrentControllerInfo
public final MediaSessionManager.RemoteUserInfo getCurrentControllerInfo ()
获取发送当前请求的控制器信息。
注意:这只在请求回调时有效,如MediaSessionCompat.Callback.onPlay()。
注意:从API 21到23,这个方法返回一个假的MediaSessionManager.RemoteUserInfo,取值如下:
包名为MediaSessionManager.RemoteUserInfo.LEGACY_CONTROLLER。
PID和UID的值为负值。
注意:从API 24到27,MediaSessionManager。从这个方法返回的RemoteUserInfo将具有负的uid和pid。在大多数情况下,它将具有正确的包名,但有时它将无法获得正确的包名。
getMediaSession
public Object getMediaSession ()
获取基础框架MediaSession对象。
此方法仅支持API 21+。
getRemoteControlClient
public Object getRemoteControlClient ()
getSessionToken
public MediaSessionCompat.Token getSessionToken ()
检索一个令牌对象,应用程序可以使用它来创建一个MediaControllerCompat来与这个会话进行交互。会话的所有者负责决定如何分发这些令牌。
在Build.VERSION_CODES之前的平台版本上。LOLLIPOP这个令牌只能在你的应用程序中使用,因为没有办法保证其他应用程序使用相同版本的支持库。
未完待续