谷歌官方提供了MediaBroswerService,通过其可以帮助我们实现上述的需求。
MediaBroswerService
- Android多媒体架构
Android多媒体播放采用client,server架构,一个server可以对应多个client,client在使用的时候需要先连接到server,双方通过设置的一些callback来进行状态的同步。
使用MediaBrowserService播放
客户端需要创建MediaBrowser,服务端需要实现MediaBrowserService,在建立连接后,两端之间的交互主要通过MediaController和MediaSession。两个类之间通过预先定义的callback进行交互,MediaSession控制着播放器的播放,MediaController来控制着UI的变化。
- Media session
一个session持有了播放器的状态和关于正在播放的一些信息,一个seesion可以接收来自一个或多个媒体播放器的callback。这使得通过其它设备来控制成为可能。
- Media controller
我们的UI只是和Media controller交互,而不是Player 本身,Media controller会将一些控制信息传递给Media Session,它也会在seesion发生变化的时候,得到来自session的回调,一个media controller一次只可以连接一个session。当使用一个media contoller和Session的时候,我们可以在运行期部署多个播放器,在其执行的时候根据设备去修改app的外观。
使用MediaBrowserService可以让Android Wear, Auto非常容易找我们的App,连接它,浏览它的内容,控制其播放,而完全不需要接触我们的UI Activity。
服务端实现
- 服务端基础配置
mainfeat 配置
MediaPlaybackService的初始化
public class MediaPlaybackService extends MediaBrowserServiceCompat {
@Override
public void onCreate() {
super.onCreate();
// 1. 初始化 MediaSession
mSession = new MediaSessionCompat(this, “MusicService”);
// 2. 设置 MedisSessionCallback
mSession.setCallback(mSessionCallback);
// 3. 开启 MediaButton 和 TransportControls 的支持
mSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
// 4. 初始化 PlaybackState
mStateBuilder = new PlaybackStateCompat.Builder()
.setActions(
PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PLAY_PAUSE);
mSession.setPlaybackState(mStateBuilder.build());
// 5. 关联 SessionToken
setSessionToken(mSession.getSessionToken());
}
}
根据包名做权限判断之后,返回根路径
@Override
public BrowserRoot onGetRoot(String clientPackageName, int clientUid, Bundle rootHints) {
// 根据包名对每个访问端做一些访问权限判断等
}
用来根据mediaID来返回第三放App所需要获得媒体数据
@Override
public void onl oadChildren(final String parentMediaId,
final Result<List> result) {
// 根据parentMediaId返回播放列表相关信息
}
客户端连接
private void initMediaBrowser() {
//1.待连接的服务
ComponentName componentName = new ComponentName(“com.example.android.uamp”,“com.example.android.uamp.MusicService”);
//2.创建MediaBrowser
mMediaBrowser = new MediaBrowserCompat(this, componentName, mConnectionCallbacks, null);
//3.建立连接
mMediaBrowser.connect();
}
设置相应的callback,连接Callback,数据变化Callback
连接状态同步
数据变化Callback设置
private final MediaBrowserCompat.ConnectionCallback mConnectionCallbacks =
new MediaBrowserCompat.ConnectionCallback() {
@Override
public void onConnected() {
//连接成功回调
}
@Override
public void onConnectionSuspended() {
//连接中断回调
}
@Override
public void onConnectionFailed() {
//连接失败回调
}
};
MediaControllerCompat.Callback controllerCallback =
new MediaControllerCompat.Callback() {
public void onSessionDestroyed() {
//Session销毁
}
@Override
public void onRepeatModeChanged(int repeatMode) {
//循环模式发生变化
}
@Override
public void onShuffleModeChanged(int shuffleMode) {
//随机模式发生变化
}
@Override
public void onMetadataChanged(MediaMetadataCompat metadata) {
//数据变化
}
@Override
public void onPlaybackStateChanged(PlaybackStateCompat state) {
//播放状态变化
}
};
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
以上分享【我的阿里P7移动开发架构师学习笔记】七大模块整套学习资料均免费分享,需要的小伙伴,我已经上传到石墨文档了,大家自取就可以了。白嫖可以,别忘了给我点个关注哈。
当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
如果你需要,我把他放在GitHub了,无偿分享的。
【Android架构视频+BATJ面试专题PDF+学习笔记】
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
【Android架构视频+BATJ面试专题PDF+学习笔记】
[外链图片转存中…(img-f1UqVXoO-1711349510198)]
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
标签:MediaBroswerService,连接,App,public,Override,new,Android,void From: https://blog.csdn.net/qd520_1314/article/details/137014260