回顾Android Studio音乐播放器的编写

来源:互联网 发布:mybatis打印sql语句 编辑:程序博客网 时间:2024/06/04 19:58

这是自己在大三上学期移动应用开发课的作业。记得刚开始写这个播放器的时候,好像安卓7.0才出不久,第一行代码第二版也是快要发行的。半年多没有学Java了,现在重新开始整理自己这份作业,回头看起代码。。。。。。这在写的什么东西。有一些粗心的错误当时也没有改正过来,而且读取音乐歌曲的部分代码没有继续抽象出来成一个函数。虽然写的渣但是还是要把工程放出来再见

GitHub地址:https://github.com/BAJIAObujie/LHZMusicPlayer    

演示视频:https://www.bilibili.com/video/av11394295/?from=search&seid=9137291263524629400

主页:https://bajiaobujie.github.io/LHZMusicPlayer/

---------------------------------------------------------------------------------------------------------------------------------------------

首先介绍这个音乐播放器的大概布局:安卓有四大组件活动Activity、服务Service、广播Broadcast、内容提供者Content Provider。这个APP也算是都用到了这几个组件.

一个服务:musicservice 音乐服务

1、start函数,控制播放或者暂停。 startnew函数,得到一首音乐的地址,播放这一首音乐。     

2、开启另外一个线程handle更新主界面的歌曲进度条,发送一次进度信息后,线程休息一秒钟,然后继续发送下一秒的进度信息。

3、onStartCommand用来接收活动传递过来的数据,根据action做出相应操作


三个活动:

一、mainactivity 主界面

1、上/下一首按钮。根据在本地曲库点击后得到的SQL播放列表,查询列表下一首歌曲的的信息,传递给musicservice的startnew函数一个地址,播放下一首音乐。

2、播放/暂停按钮,点击后会启用musicservice的start函数,start函数会判断,如果是处于播放状态,切换至暂停,同时图标更新为暂停的图标;如果是处于暂停状态则继续播放,图标更新为播放。

3、本地曲库和播放列表按钮,进入对应的活动

二、localmusicactivity 本地所有音乐曲目的界面 

1、定义一个Music类,里面包含了歌曲的相关信息,比如歌曲地址,名字还有歌手以及get方法;

2、findmusic类用来查找本地音乐信息,将歌曲传递到之前定义的Music型形成一个list<Music>的数组,并返回这个数组;

3、MusicAdapter自定义listview适配器,让listview显示全部歌曲。 

4、当在本地曲库点击某一首歌曲的时候,如果这首歌曲播放列表已有,则不添加到播放列表,如果没有则添加到播放列表。具体操作为将该首歌曲的信息传入相应的SQL表格中,SQL表中的数据将作为playlist(播放列表)里listview歌单的数据显示出来。

三、playlist播放列表

1、主体结构和localmusicactivity一样,只不过localmusicactivity是读取手机的全部音乐,而playlist是读取自己新建的表格的歌曲。

2、在playlist里新增有长按弹出选项,删除功能。也有一个清空播放列表的功能。


消息传递

一、活动传递数据到服务

通过ServiceConnection和bindService还有createExplicitFromImplicitIntent这三个方法,活动发送数据到服务。

1、(调用无参数方法)比如音乐服务里的start方法,活动可以直接进行操作控制暂停或播放。      

2、(调用有参数方法)对于需要传递相关参数的,比如startnew方法里需要传入一首歌曲的地址,你需要用到第三个方法createExplicitFromImplicitIntent。首先在活动中新建一个intent(action),传入extra。startservice(intent)。通过startservice,服务会调用 onStartCommand方法来处理传递过来的intent,这涉及到服务的生命周期。然后我们在onStartCommand根据之前定义的不同的action,做出处理。对于startnew来说就是 在onStartCommand方法中 得到intent中的music信息,取出音乐的地址,然后就可以调用startnew了。

二、服务传递数据到活动

在主活动中注册了动态广播(这个广播除非你退出APP否则是不会退出的,如果在其他两个活动注册动态广播,那么你从其他两个活动界面返回主活动界面的时候,动态广播也被释放了),来接受来自服务的消息。

1、(更新标题和歌手)点击一首新的音乐的时候,首页的歌名和歌手两个textview必须要接收到数据来更新界面。而且前面说到播放一首新的音乐的时候,必须会调用到服务里的onStartCommand方法,所以我们在onStartCommand里,startnew播放一首新的音乐之后,还要sendbroadcast,发送一个广播到主活动里,主活动绑定一个相应的过滤器,接收数据更新界面。

2、(更新进度条)主活动第二个更新界面的地方在下方的进度条,因为进度条是随时更新的。而且不能把更新写在主线程里。所以在音乐服务里另外开了一个线程handle。每隔一秒钟发送一次当前音乐播放到的进度百分比的广播。然后主界面接收到后更新。


内容提供者:

localmusicactivity活动里本地音乐的信息是怎么得到的呢?在安卓内部有一个内置表格,不管你通过什么方式添加进歌曲,这个内置表格都会写入歌曲的相应信息。localmusicactivity里用到了findmusic返回了一个List<Music>,findmusic里就是查找到了这个表格,并逐一把歌曲放进数组里。


除了以上这四个组件外,还有三点是自己想说的:

一、XML布局,布局层层嵌套,这一点和QT Creator的界面使用是一样的。

二、在主界面里加入了滑动功能,左滑动右滑动可以进入其他两个活动界面,同时加入了动画,界面过渡自然。

三、自己的手机是Android6.0以上的,6.0以上的版本要求使用本地内容的时候需要动态注册权限。

6.0以前的版本是在安装APP的时候就一口气弹出一个列表,让手机使用者把这些权限给APP。写代码的时候只需要在manifest里把注册权限的代码写好就行。但是6.0以后要求使用到什么权限的时候,就弹出什么请求框要求你把权限给他,不再像以前一样一次性权限全给。当时自己还查了好多博客怎么动态注册权限,现在过了这么久了,8.0都出了,是不是已经没人关心这个问题了(笑)。