Android MediaController&MediaSession

一、MediaSession

MediaSession框架是google在android5之后引入的一个音乐播放框架,用来解决音乐界面和服务之间的通信问题,它的主要作用是规范了媒体服务和界面的通信接口,达到了完全解耦,可以自由、高效进行不同的媒体的切换。

MediaSession框架规范了音视频应用中界面与播放器之间的通信接口,实现界面与播放器之间的完全解耦,MediaSession框架定义了媒体会话和媒体控制两个重要的类,它们为构建多媒体播放器应用提供了一个完善的技术架构。

要注意MediaSession仅提供客户端Activit和服务端Service之间的通信接口,UI部分和Player(如:MediaPlayer)部分还需要我们实现,其中UI部分需要有对应的按键,如Play按键,如果有视频播放还需要有SurfaceView或者TextureView,Player部分需要在服务端MediaSession.Callback() 的回调方法中调用播放器(如MediaPlayer)的相应接口。

MediaSession框架中有四个常用的成员类,它们是整个流程控制的核心,下面我们一一介绍一下:

MediaBrowser:媒体浏览器,用来连接服务,在连接成功的结果回调后,获取token(配对令牌),并以此获得MediaController媒体控制器。同时,有订阅并设置订阅信息回调的功能。

MediaController:媒体控制器,可以用mMediaController.getMetadata()等方法来主动获取媒体信息,也可以使用形如mMediaController.getTransportControls().skipToNext()来发送控制指令。其次一般需要注册MediaController.Callback回调进行客户端更新。

MediaBrowserService:浏览器服务,实现具体的媒体逻辑。一般在oncrete()中用setSessionToken(...)来设置token。在重写的onGetRoot(…)中判断是否允许连接,在onLoadChildren(…)中处理订阅信息。

MediaSeesion:设置MediaSeesion.Callback,这里就是客户端指令送达的地方。在媒体信息或状态改变后,使用形如mediaSession.setMetadata(mediaMetadata)来通知客户端。

上面的4个关键类中,MediaBrowser和MediaController是客户端使用的,MediaBrowserService和MediaSession是服务端使用的。

由于客户端和服务端是异步通信,所以采用的大量的回调,因此有大量的回调类,下面我们大概介绍一些关键的。

MediaBrowser.ConnectionCallback

连接状态回调,当MediaBrowser向service发起连接请求后,请求结果将在这个callback中返回,获取到的meidaId对应服务端在onGetRoot函数中设置的mediaId,如果连接成功那么就可以做创建媒体控制器之类的操作了。

MediaBrowser.SubscriptionCallback

连接成功后进一步是订阅,同样需要注册订阅回调,订阅成功的话服务端可以返回一个音乐信息的序列,我们可以保存起来作为音乐列表展示。

MediaControllerCompat.Callback

媒体控制器是负责向service发送例如播放暂停之类的指令的,这些指令的执行结果将在这个回调中返回,可重写的函数有很多,比如播放状态改变了,音乐信息改变,列表变化等,按需要自己实现。

MediaSessionCompat.Callback

在客户端发送过来的指令会在这个callback中内调用,如上一曲下一曲之类的

二、MediaSession相关接口

ISession

Interface to a MediaSession in the system.

与系统中媒体会话的接口。

ISession代码位于:

frameworks/base/media/java/android/media/Session/ISession.aidl

ISession的定义:

interface ISession {}

ISession方法:

void sendEvent(String event, in Bundle data):
ISessionController getController():
void setFlags(int flags):
void setActive(boolean active):
void setMediaButtonReceiver(in PendingIntent mbr, String sessionPackageName):
void setMediaButtonBroadcastReceiver(in ComponentName broadcastReceiver):
void setLaunchPendingIntent(in PendingIntent pi):
void destroySession():
void setMetadata(in MediaMetadata metadata, long duration, String metadataDescription):
void setPlaybackState(in PlaybackState state):
void resetQueue():
IBinder getBinderForSetQueue():
void setQueueTitle(CharSequence title):
void setExtras(in Bundle extras):
void setRatingType(int type):
void setPlaybackToLocal(in AudioAttributes attributes):
void setPlaybackToRemote(int control, int max, @nullable String controlId):
void setCurrentVolume(int currentVolume):

ISessionCallback

ISessionCallback代码位于:

frameworks/base/media/java/android/media/Session/ISessionCallback.aidl

ISessionCallback的定义:

interface ISessionCallback {}

ISessionCallback方法:

void onCommand(String packageName, int pid, int uid, String command, in Bundle args, in ResultReceiver cb):
void onMediaButton(String packageName, int pid, int uid, in Intent mediaButtonIntent, int sequenceNumber, in ResultReceiver cb):
void onMediaButtonFromController(String packageName, int pid, int uid, in Intent mediaButtonIntent):
void onPrepare(String packageName, int pid, int uid):
void onPrepareFromMediaId(String packageName, int pid, int uid, String mediaId, in Bundle extras):
void onPrepareFromSearch(String packageName, int pid, int uid, String query, in Bundle extras):
void onPrepareFromUri(String packageName, int pid, int uid, in Uri uri, in Bundle extras):
void onPlay(String packageName, int pid, int uid):
void onPlayFromMediaId(String packageName, int pid, int uid, String mediaId, in Bundle extras):
void onPlayFromSearch(String packageName, int pid, int uid, String query, in Bundle extras):
void onPlayFromUri(String packageName, int pid, int uid, in Uri uri, in Bundle extras):
void onSkipToTrack(String packageName, int pid, int uid, long id):
void onPause(String packageName, int pid, int uid):
void onStop(String packageName, int pid, int uid):
void onNext(String packageName, int pid, int uid):
void onPrevious(String packageName, int pid, int uid):
void onFastForward(String packageName, int pid, int uid):
void onRewind(String packageName, int pid, int uid):
void onSeekTo(String packageName, int pid, int uid, long pos):
void onRate(String packageName, int pid, int uid, in Rating rating):
void onSetPlaybackSpeed(String packageName, int pid, int uid, float speed):
void onCustomAction(String packageName, int pid, int uid, String action, in Bundle args):
void onAdjustVolume(String packageName, int pid, int uid, int direction):
void onSetVolumeTo(String packageName, int pid, int uid, int value):

ISessionController

Interface to MediaSessionRecord in the system.

媒体会话的接口在系统中记录。

ISessionController代码位于:

frameworks/base/media/java/android/media/Session/ISessionController.aidl

ISessionController的定义:

interface ISessionController {}

ISessionController方法:

void sendCommand(String packageName, String command, in Bundle args, in ResultReceiver cb):
boolean sendMediaButton(String packageName, in KeyEvent mediaButton):
void registerCallback(String packageName, in ISessionControllerCallback cb):
void unregisterCallback(in ISessionControllerCallback cb):
String getPackageName():
String getTag():
Bundle getSessionInfo():
PendingIntent getLaunchPendingIntent():
long getFlags():
MediaController.PlaybackInfo getVolumeAttributes():
void adjustVolume(String packageName, String opPackageName, int direction, int flags):
void setVolumeTo(String packageName, String opPackageName, int value, int flags):
void prepare(String packageName):
void prepareFromMediaId(String packageName, String mediaId, in Bundle extras):
void prepareFromSearch(String packageName, String string, in Bundle extras):
void prepareFromUri(String packageName, in Uri uri, in Bundle extras):
void play(String packageName):
void playFromMediaId(String packageName, String mediaId, in Bundle extras):
void playFromSearch(String packageName, String string, in Bundle extras):
void playFromUri(String packageName, in Uri uri, in Bundle extras):
void skipToQueueItem(String packageName, long id):
void pause(String packageName):
void stop(String packageName):
void next(String packageName):
void previous(String packageName):
void fastForward(String packageName):
void rewind(String packageName):
void seekTo(String packageName, long pos):
void rate(String packageName, in Rating rating):
void setPlaybackSpeed(String packageName, float speed):
void sendCustomAction(String packageName, String action, in Bundle args):
MediaMetadata getMetadata():
PlaybackState getPlaybackState():
ParceledListSlice getQueue():
CharSequence getQueueTitle():
Bundle getExtras():
int getRatingType():

ISessionControllerCallback

ISessionControllerCallback代码位于:

frameworks/base/media/java/android/media/Session/ISessionControllerCallback.aidl

ISessionControllerCallback的定义:

interface ISessionControllerCallback {}

ISessionControllerCallback方法:

void onEvent(String event, in Bundle extras):
void onSessionDestroyed():
void onPlaybackStateChanged(in PlaybackState state):
void onMetadataChanged(in MediaMetadata metadata):
void onQueueChanged(in ParceledListSlice queue):
void onQueueTitleChanged(CharSequence title):
void onExtrasChanged(in Bundle extras):
void onVolumeInfoChanged(in MediaController.PlaybackInfo info):

ISessionManager

Interface to the MediaSessionManagerService

ISessionManager代码位于:

frameworks/base/media/java/android/media/Session/ISessionManager.aidl

ISessionManager的定义:

interface ISessionManager {}

ISessionManager方法:

ISession createSession(String packageName, in ISessionCallback sessionCb, String tag, in Bundle sessionInfo, int userId);
List<MediaSession.Token> getSessions(in ComponentName compName, int userId);
MediaSession.Token getMediaKeyEventSession(String packageName);
String getMediaKeyEventSessionPackageName(String packageName);
void dispatchMediaKeyEvent(String packageName, boolean asSystemService, in KeyEvent keyEvent, boolean needWakeLock);
boolean dispatchMediaKeyEventToSessionAsSystemService(String packageName, in KeyEvent keyEvent, in MediaSession.Token sessionToken);
void dispatchVolumeKeyEvent(String packageName, String opPackageName, boolean asSystemService, in KeyEvent keyEvent, int stream, boolean musicOnly);
      void dispatchVolumeKeyEventToSessionAsSystemService(String packageName, String opPackageName, in KeyEvent keyEvent, in MediaSession.Token sessionToken);
void dispatchAdjustVolume(String packageName, String opPackageName, int suggestedStream, int delta, int flags);
void addSessionsListener(in IActiveSessionsListener listener, in ComponentName compName, int userId);
void removeSessionsListener(in IActiveSessionsListener listener);
void addSession2TokensListener(in ISession2TokensListener listener, int userId);
void removeSession2TokensListener(in ISession2TokensListener listener);
void registerRemoteSessionCallback(in IRemoteSessionCallback rvc);
void unregisterRemoteSessionCallback(in IRemoteSessionCallback rvc);
boolean isGlobalPriorityActive();
void addOnMediaKeyEventDispatchedListener(in IOnMediaKeyEventDispatchedListener listener);
void removeOnMediaKeyEventDispatchedListener(in IOnMediaKeyEventDispatchedListener listener);
void addOnMediaKeyEventSessionChangedListener(in IOnMediaKeyEventSessionChangedListener listener, String packageName);
void removeOnMediaKeyEventSessionChangedListener(in IOnMediaKeyEventSessionChangedListener listener);
void setOnVolumeKeyLongPressListener(in IOnVolumeKeyLongPressListener listener);
void setOnMediaKeyListener(in IOnMediaKeyListener listener);
boolean isTrusted(String controllerPackageName, int controllerPid, int controllerUid);
void setCustomMediaKeyDispatcher(String name);
void setCustomMediaSessionPolicyProvider(String name);
boolean hasCustomMediaKeyDispatcher(String componentName);
boolean hasCustomMediaSessionPolicyProvider(String componentName);
int getSessionPolicies(in MediaSession.Token token);
void setSessionPolicies(in MediaSession.Token token, int policies);

IMediaBrowserService

Media API allows clients to browse through hierarchy of a user’s media collection, playback a specific media entry and interact with the now playing queue.

媒体 API 允许客户端浏览用户媒体集合的层次结构,播放特定媒体条目并与正在播放的队列进行交互。

IMediaBrowserService代码位于:

frameworks/base/media/java/android/media/IMediaBrowserService.aidl

IMediaBrowserService的定义:

interface IMediaBrowserService {}

IMediaBrowserService方法:

void connect(String pkg, in Bundle rootHints, IMediaBrowserServiceCallbacks callbacks):
void disconnect(IMediaBrowserServiceCallbacks callbacks):
void addSubscriptionDeprecated(String uri, IMediaBrowserServiceCallbacks callbacks):
void removeSubscriptionDeprecated(String uri, IMediaBrowserServiceCallbacks callbacks):
void getMediaItem(String uri, in ResultReceiver cb, IMediaBrowserServiceCallbacks callbacks):
void addSubscription(String uri, in IBinder token, in Bundle options, IMediaBrowserServiceCallbacks callbacks):
void removeSubscription(String uri, in IBinder token, IMediaBrowserServiceCallbacks callbacks):

IMediaBrowserServiceCallbacks

Media API allows clients to browse through hierarchy of a user’s media collection, playback a specific media entry and interact with the now playing queue.

媒体 API 允许客户端浏览用户媒体集合的层次结构,播放特定媒体条目并与正在播放的队列进行交互。

IMediaBrowserServiceCallbacks代码位于:

frameworks/base/media/java/android/media/IMediaBrowserServiceCallbacks.aidl

IMediaBrowserServiceCallbacks的定义:

interface IMediaBrowserServiceCallbacks {}

IMediaBrowserServiceCallbacks方法:

void onConnect(String root, in MediaSession.Token session, in Bundle extras):
void onConnectFailed():
void onLoadChildren(String mediaId, in ParceledListSlice list, in Bundle options):

三、MediaSession相关类

如下为MediaSession相关类图:

MediaBrowser

媒体浏览器,用来连接媒体服务MediaBrowserService和订阅数据,在注册的回调接口中我们就可以获取到Service的连接状态、获取音乐数据。一般在客户端中创建。

MediaBrowser代码位于:

frameworks/base/media/java/android/media/browse/MediaBrowser.java

MediaController的定义:

public final class MediaBrowser{
    public static class MediaItem implements Parcelable {}
    public static class ConnectionCallback {}
    public abstract static class SubscriptionCallback {}
    public abstract static class ItemCallback {}
    private class MediaServiceConnection implements ServiceConnection {}
    private static class ServiceCallbacks extends IMediaBrowserServiceCallbacks.Stub {}
    private static class Subscription {}
}

MediaBrowser API:

public void connect() :连接
public void disconnect(): 断开连接
public boolean isConnected() :是否链接
public @NonNull ComponentName getServiceComponent() :获取服务组件
public @NonNull String getRoot() :获取根ID
public @Nullable Bundle getExtras() :获取额外信息
public @NonNull MediaSession.Token getSessionToken() :获取对话令牌
public void subscribe(@NonNull String parentId, @NonNull SubscriptionCallback callback) :订阅
public void subscribe(@NonNull String parentId, @NonNull Bundle options, @NonNull SubscriptionCallback callback):订阅
public void unsubscribe(@NonNull String parentId):退订
public void unsubscribe(@NonNull String parentId, @NonNull SubscriptionCallback callback):退订
public void getItem(final @NonNull String mediaId, @NonNull final ItemCallback cb) :获取指定媒体项的MediaBrowser.MediaItem对象
MediaBrowser ConnectionCallback API:
public void onConnected() :连接成功
public void onConnectionSuspended():连接暂停
public void onConnectionFailed():连接失败

MediaController

MediaController是Android系统提供的一个视图组件,用于控制媒体播放器的操作,MediaController通常用于配合VideoView、MediaSession媒体播放器组件一起使用,方便用户操作。MediaController提供了一系列的控制按钮,如播放/暂停、快进/快退、视频进度条、音量控制等,这些按钮可以方便的显示和隐藏,并且可以根据应用需求进行定制。

除了基本的控制按钮,MediaController还提供了一些高级功能,比如显示缩略图、显示字幕等,这些功能可以通过继承MediaController并重写齐总的方法来实现。MediaController是一个视图组件,需要添加到应用的界面布局中才可以正常显示。同时,MediaController也需要与媒体播放器组件进行联动才能正常工作。

MediaController 代码位于:

frameworks/base/media/java/android/media/session/MediaController.java

MediaController 的定义:

public final class MediaController {
    public abstract static class Callback {}
    public final class TransportControls {} //传输控制	
    public static final class PlaybackInfo implements Parcelable {}
    private static final class CallbackStub extends ISessionControllerCallback.Stub {}
    private static final class MessageHandler extends Handler {}
}

MediaController API:

void adjustVolume(int direction, int flags):调整此会话正在播放的输出音量。
boolean dispatchMediaButtonEvent(KeyEvent keyEvent):将指定的媒体按钮事件发送到会话。
Bundle getExtras():获得本次会议的额外资讯。
long getFlags():获取此会话的标志。
MediaMetadata getMetadata():获取此会话的当前元数据。
String getPackageName():获取会话所有者的包名称。
MediaController.PlaybackInfo getPlaybackInfo():获取此会话的当前播放信息。
PlaybackState getPlaybackState():获取此会话的当前播放状态。
List<MediaSession.QueueItem> getQueue():如果设置了此会话,则获取当前的播放队列。
CharSequence getQueueTitle():获取此会话的队列标题。
int getRatingType():获取会话支持的评级类型。
PendingIntent getSessionActivity():获取启动与此会话关联的用户界面(如果存在)的意图。
MediaSession.Token getSessionToken():获取与此连接的会话的令牌。
MediaController.TransportControls getTransportControls():获取 MediaController.TransportControls实例以将传输操作发送到关联的会话。
void registerCallback(MediaController.Callback callback, Handler handler):注册回调以接收来自会话的更新。
void registerCallback(MediaController.Callback callback):注册回调以接收来自会话的更新。
void sendCommand(String command, Bundle args, ResultReceiver cb):向会话发送通用命令。
void setVolumeTo(int value, int flags):设置此会话正在播放的输出音量。
void  unregisterCallback(MediaController.Callback callback):取消注册指定的回调。
MediaController.Callback API:
void onAudioInfoChanged(MediaController.PlaybackInfo info):覆盖以处理对音频信息的更改。
void onExtrasChanged(Bundle extras):重写以处理对MediaSession演员的更改。
void onMetadataChanged(MediaMetadata metadata):覆盖以处理对当前元数据的更改。
void onPlaybackStateChanged(PlaybackState state):覆盖以处理播放状态的变化。
void onQueueChanged(List<MediaSession.QueueItem> queue):重写以处理对队列中项目的更改。
void onQueueTitleChanged(CharSequence title):重写以处理对队列标题的更改。
void onSessionDestroyed():重写以处理被销毁的会话。
void onSessionEvent(String event, Bundle extras):重写以处理由会话所有者发送的没有指定接口的自定义事件。
MediaController.PlaybackInfo API:
AudioAttributes getAudioAttributes():获取此会话的音频属性。
int getCurrentVolume():获取本次会话的当前音量。
int getMaxVolume():获取可能为此会话设置的最大音量。
int getPlaybackType():获取影响音量处理的播放类型。
int getVolumeControl():获取可以使用的音量控制类型。
MediaController.TransportControls API:
void fastForward():开始快进。
void pause():请求播放器暂停播放并保持当前位置。
void play():请求播放器在当前位置开始播放。
void playFromMediaId(String mediaId, Bundle extras):请求播放器开始播放特定媒体ID。
void playFromSearch(String query, Bundle extras):请求播放器为特定的搜索查询开始播放。
void playFromUri(Uri uri, Bundle extras):开始播放特定的 Uri 。
void prepare():请求播放器准备播放。
void prepareFromMediaId(String mediaId, Bundle extras):请求播放器准备播放特定媒体ID。
void prepareFromSearch(String query, Bundle extras):请求播放器为特定的搜索查询准备播放。
void prepareFromUri(Uri uri, Bundle extras):请求播放器为特定的 Uri准备播放。
void rewind():开始快退。
void seekTo(long pos):移动到媒体流中的新位置。
void sendCustomAction(PlaybackState.CustomAction customAction, Bundle args):发送一个自定义操作返回 MediaSession执行。
void sendCustomAction(String action, Bundle args):将自定义操作的ID和参数发送回 MediaSession执行。
void setRating(Rating rating):评价当前内容。
void skipToNext():跳到下一个项目。
void skipToPrevious():跳到上一个项目。
void skipToQueueItem(long id):在播放队列中播放具有特定ID的项目。
void stop():要求播放器停止播放; 它可以以任何适当的方式清除其状态。

MediaSession

MediaSession是Android系统提供的一个多媒体控制架构,用于帮助Android应用程序在后台控制和处理多媒体播放器相关的事件。通过MediaSession,开发者可以使应用程序与多媒体播放器之间实现无缝的交互,在多媒体播放器未打开的情况下,或多个应用程序同时使用播放器的情况下,MediaSession可以确保应用程序能够正确地控制和处理播放器事件。

一个MediaSession实例代表了整个多媒体播放器的会话,包括播放状态、进度、媒体信息等。以这个会话为基础,应用程序可以注册一个MediaController,从而实现对多媒体播放器的控制,比如播放、暂停、快进等控制操作。

MediaSession还提供了一些回调接口,用于处理各种多媒体播放器事件,比如媒体信息更新事件、播放状态更新事件、时间轴事件等。这些回调接口可以让开发者在应用程序中处理这些事件,进行自定义的处理逻辑。

MediaSession代码位于:

frameworks/base/media/java/android/media/session/MediaSession.java

MediaSession的定义:

public final class MediaSession {
    public static final class Token implements Parcelable {}
    public abstract static class Callback {}
    public static class CallbackStub extends ISessionCallback.Stub {}
    public static final class QueueItem implements Parcelable {}
    private static final class Command {}
    private class CallbackMessageHandler extends Handler {}
}

MediaSession API:

MediaController getController():获取此会话的控制器。
MediaSession.Token getSessionToken():检索可供应用程序使用的令牌对象,以创建用于与此会话进行交互的 MediaController 。
boolean isActive():获取此会话的当前活动状态。
void release():当应用程序完成播放时必须调用此选项。
void sendSessionEvent(String event, Bundle extras):向所有监听本会话的MediaController发送专有事件。
void setActive(boolean active):如果此会话当前处于活动状态并准备好接收命令,请设置。
void setCallback(MediaSession.Callback callback):将回调设置为接收MediaSession的更新。
void setCallback(MediaSession.Callback callback, Handler handler):将回调设置为接收MediaSession的更新。
void setExtras(Bundle extras):设置一些可以与 MediaSession关联的 MediaSession 。
void setFlags(int flags):为会话设置任何标志。
void setMediaButtonReceiver(PendingIntent mbr):为媒体按钮接收器设置挂起的意图,以允许在会话停止后重新开始播放。
void setPlaybackState(PlaybackState state):更新当前播放状态。
void setPlaybackToLocal(AudioAttributes attributes):设置此会话音频的属性。
void setPlaybackToRemote(VolumeProvider volumeProvider):配置此会话以使用远程卷处理。
void setQueue(List<MediaSession.QueueItem> queue):更新播放队列中的项目列表。
void setQueueTitle(CharSequence title):设置播放队列的标题。
void setRatingType(int type):设置此会话使用的评分风格。
void setSessionActivity(PendingIntent pi):为此会话设置启动用户界面的意图。
MediaSession.Callback API:
void onCommand(String command, Bundle args, ResultReceiver cb):当控制器向该会话发送命令时调用。
void onCustomAction(String action, Bundle extras):当 MediaController想要执行 PlaybackState.CustomAction时调用。
void onFastForward():重写以处理请求以快进。
boolean onMediaButtonEvent(Intent mediaButtonIntent):当按下媒体按钮并且此会话具有最高优先级或控制器向会话发送媒体按钮事件时调用。
void onPause():重写以处理暂停播放的请求。
void onPlay():重写以处理开始播放的请求。
void onPlayFromMediaId(String mediaId, Bundle extras):重写处理请求以播放由您的应用 MediaBrowserService提供的特定 MediaBrowserService 。
void onPlayFromUri(Uri uri, Bundle extras):重写以处理请求以播放由URI表示的特定媒体项目。
void onPrepare():重写以处理准备播放的请求。
void onPrepareFromMediaId(String mediaId, Bundle extras):覆盖处理请求以准备播放由您的应用 MediaBrowserService提供的特定 MediaBrowserService 。
void onPrepareFromSearch(String query, Bundle extras):重写以处理从搜索查询准备播放的请求。
void onPrepareFromUri(Uri uri, Bundle extras):重写以处理准备由URI表示的特定媒体项目的请求。
void onRewind():重写以处理请求后退。
void onSeekTo(long pos):重写以处理请求,以毫秒为单位寻找特定的位置。
void onSetRating(Rating rating):重写以处理被评价的项目。
void onSkipToNext():覆盖处理请求以跳到下一个媒体项目。
void onSkipToPrevious():覆盖处理请求以跳过前一个媒体项目。
void onSkipToQueueItem(long id):重写处理请求,以播放来自播放队列的给定ID的项目。
void onStop():覆盖以处理停止播放的请求。
MediaSession.QueueItem API:
int describeContents():描述此Parcelable实例的封送表示中包含的特殊对象的种类。
MediaDescription getDescription():获取这个项目的描述。
long getQueueId():获取此项目的队列ID。
String toString():返回对象的字符串表示形式。
void writeToParcel(Parcel dest, int flags):将此对象平铺到一个包裹中。

MediaSessionManager

Provides support for interacting with {MediaSession media sessions}that applications have published to express their ongoing media playback state.

提供与应用程序已发布的 {MediaSession 媒体会话}交互的支持,以表达其正在进行的媒体播放状态。

MediaSessionManager代码位于:

frameworks/base/media/java/android/media/session/MediaSessionManager.java

MediaSessionManager的定义:

public final class MediaSessionManager {
    public static final class RemoteUserInfo {}
    private static final class SessionsChangedWrapper {}
    private static final class Session2TokensChangedWrapper {}
    private static final class OnVolumeKeyLongPressListenerImpl extends IOnVolumeKeyLongPressListener.Stub {}
    private static final class OnMediaKeyListenerImpl extends IOnMediaKeyListener.Stub {}
    private final class OnMediaKeyEventDispatchedListenerStub extends IOnMediaKeyEventDispatchedListener.Stub {}
    private final class OnMediaKeyEventSessionChangedListenerStub extends IOnMediaKeyEventSessionChangedListener.Stub {}
    private final class RemoteSessionCallbackStub extends IRemoteSessionCallback.Stub {}
}

MediaSessionManager API:

void addOnActiveSessionsChangedListener(MediaSessionManager.OnActiveSessionsChangedListener sessionListener, ComponentName notificationListener):添加一个侦听器,当活动会话列表发生变化时通知它。这需要调用应用程序拥有android.Manifest.permission.MEDIA_CONTENT_CONTROL权限。
void addOnActiveSessionsChangedListener(MediaSessionManager.OnActiveSessionsChangedListener sessionListener, ComponentName notificationListener, Handler handler):添加一个侦听器,当活动会话列表发生变化时通知它。这需要调用应用程序拥有android.Manifest.permission.MEDIA_CONTENT_CONTROL权限。
List<MediaController> getActiveSessions(ComponentName notificationListener):获取所有正在进行的会话的控制器列表。
void removeOnActiveSessionsChangedListener(MediaSessionManager.OnActiveSessionsChangedListener listener):停止接收指定侦听器上的活动会话更新。

MediaBrowserService

媒体服务,它有两个关键的回调函数,onGetRoot(控制客户端媒体浏览器的连接请求,返回值中决定是否允许连接),onLoadChildren(媒体浏览器向服务器发送数据订阅请求时会被调用,一般在这里执行异步获取数据的操作,然后在将数据发送回媒体浏览器注册的接口中)。

MediaBrowserService 提供两个主要功能:

当您使用 MediaBrowserService 时,具有 MediaBrowser 的其他组件和应用可以发现您的服务,创建自己的媒体控制器,连接到您的媒体会话,并控制播放器。Wear OS 和 Android Auto 应用才得以访问您的媒体应用。

此外,它还提供了一个可选的 Browsing API。应用可以不使用此功能。通过 Browsing API,客户端可以查询服务并构建其内容层次结构的表示,这可能表示播放列表、媒体库或其他类型的集合。

MediaBrowserService代码位于:

frameworks/base/media/java/android/service/media/MediaBrowserService.java

MediaBrowserService的定义:

public abstract class MediaBrowserService extends Service {
    private static class ConnectionRecord implements IBinder.DeathRecipient {}
    public class Result<T> {}
    private static class ServiceBinder extends IMediaBrowserService.Stub {}
    public static final class BrowserRoot {}
}

MediaSessionLegacyHelper

Helper for connecting existing APIs up to the new session APIs. This can be used by RCC, AudioFocus, etc. to create a single session that translates to all those components.

用于将现有 API 连接到新会话 API 的帮助程序。这可以由RCC,AudioFocus等使用。以创建转换为所有这些组件的单个会话。

MediaSessionLegacyHelper代码位于:

frameworks/base/media/java/android/media/session/MediaSessionLegacyHelper.java

MediaSessionLegacyHelper的定义:

public class MediaSessionLegacyHelper {
    private static final class MediaButtonListener extends MediaSession.Callback {}
    private class SessionHolder {}
}

ParcelableListBinder

Binder to receive a list that has a large number of {@link Parcelable} items.

活页夹,用于接收包含大量 {包裹} 项目的列表。

ParcelableListBinder代码位于:

frameworks/base/media/java/android/media/session/ParcelableListBinder.java

ParcelableListBinder的定义:

public class ParcelableListBinder<T extends Parcelable> extends Binder {}

PlaybackState

Playback state for a {MediaSession}. This includes a state like{ PlaybackState#STATE_PLAYING}, the current playback position, and the current control capabilities.

{媒体会话} 的播放状态。这包括{ PlaybackState#STATE_PLAYING} 等状态、当前播放位置和当前控制功能。

PlaybackState代码位于:

frameworks/base/media/java/android/media/session/PlaybackState.java

PlaybackState的定义:

public final class PlaybackState implements Parcelable {
    public static final class CustomAction implements Parcelable {}
    public static final class Builder {}
}

PlaybackState API:

int describeContents():描述此Parcelable实例的封送表示中包含的特殊对象的种类。
long getActions():获取本次会议上可用的当前操作。
long getActiveQueueItemId():获取队列中当前活动项目的ID。
long getBufferedPosition():以毫秒为单位获取当前缓冲位置。
List<PlaybackState.CustomAction> getCustomActions():获取自定义操作的列表。
CharSequence getErrorMessage():获取用户可读的错误消息。
Bundle getExtras():获取在此播放状态下设置的任何自定义附加功能。
long getLastPositionUpdateTime():获取上次更新位置所用的实时时间。
float getPlaybackSpeed():获取当前播放速度为正常播放的倍数。
long getPosition():以毫秒为单位获取当前播放位置。
int getState():获取当前的播放状态。
PlaybackState.Builder API:
PlaybackState.Builder setActions(long actions):设置此会话中可用的当前操作。
PlaybackState.Builder setActiveQueueItemId(long id):通过指定其ID,将活动项目设置在播放队列中。
PlaybackState.Builder setBufferedPosition(long bufferedPosition):以ms为单位设置当前缓冲位置。
PlaybackState.Builder setErrorMessage(CharSequence error):设置用户可读的错误消息。
PlaybackState.Builder setExtras(Bundle extras):设置任何自定义附加功能以包含在播放状态中。
PlaybackState.Builder setState(int state, long position, float playbackSpeed):设置播放的当前状态。
PlaybackState.Builder setState(int state, long position, float playbackSpeed, long updateTime):设置播放的当前状态。
PlaybackState.CustomAction API:
int describeContents():描述此Parcelable实例的封送表示中包含的特殊对象的种类。
String getAction():返回 PlaybackState.CustomAction的动作。
Bundle getExtras():返回提供关于操作的其他特定于应用程序的信息的附加信息,如果没有,则返回null。
int getIcon():返回 MediaSession's包中图标的资源ID。
CharSequence getName():返回此操作的显示名称。

三、MediaSession常用方法

客户端调用服务端:

意义MediaController.TransportControlsMediaSession.Callback

播放

play()

onPlay()

停止

stop()

onStop()

暂停

pause()

onPause()

指定播放位置

seekTo(long pos)

onSeekTo(long)

快进

fastForward()

onFastForward()

回倒

rewind()

onRewind()

下一首

skipToNext()

onSkipToNext()

上一首

skipToPrevious()

onSkipToPrevious()

打分

setRating(Rating rating)

onSetRating(Rating)

服务端回调给客户端:

意义MediaSessionMediaController.Callback

当前播放音乐

setMetadata(MediaMetadata)

onMetadataChanged(MediaMetadata)

播放状态

setPlaybackState(PlaybackState)

onPlaybackStateChanged(PlaybackState)

播放队列

setQueue(List MediaSession.QueueItem>)

onQueueChanged(List MediaSession.QueueItem>)

播放队列标题

setQueueTitle(CharSequence)

onQueueTitleChanged(CharSequence)

额外信息

setExtras(Bundle)

onExtrasChanged(Bundle)

  • 26
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值