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):
b
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值