我的音乐(Musicoco)- 本地音乐播放器开发总结

开源一个功能相对齐全的本地音乐播放器

简述

从五月末就开始利用空余时间开发这款 app ,不知不觉三个月过去了。

App 名称:我的音乐,我给取了个别名:Musicoco

Android 手机本地音乐文件播放器。应用开启了单独的播放服务进程,在服务进程中控制音乐播放逻辑,目前已实现功能如下:通过耳机和通知栏快捷控制音乐播放、创建歌单、本地歌曲搜索、歌曲多选操作、记忆播放、自动切换到夜间模式、定时停止播放、应用主题自定义以及播放界面风格选择等功能。

应用截图

功能结构图

下图为应用的功能结构图,图有点繁杂,但把大部分功能都列了出来。
可进行如下归类:
1. 歌曲播放控制:播放/暂停、上/下曲切换、播放进度调整。(可从应用内、通知栏和耳机进行控制)
2. 歌曲操作:收藏/取消收藏、加入歌单/从歌单中移除、彻底删除、歌曲详情(前三个功能可选中多首歌曲后进行批量操作)
3. 歌单操作:新建、编辑、删除
4. 歌曲搜索:全部歌曲中搜索,特定歌单中搜索
5. 外观设置:播放界面风格、主题颜色、夜间/白天模式切换(自动切换)
6. 实用功能:定时停止播放、记忆播放、打开应用自动播放、图片墙
7. 额外功能:反馈、用户指南、应用信息、关于开发者、清除缓存


开发过程中遇到的部分难点

  1. aidl 进程间通信

通过在 AndroidManifest.xml 中为 Service 指定 process 属性就可以使服务运行于独立的进程中,应用中的服务为 PlayService ,应用启动时会以 startService 的方式启动服务,服务启动后会恢复上次播放歌曲(歌曲及其播放进度,前提为开启记忆播放),之后Activity再进行绑定(bindService),客户端绑定服务之后主动获取服务端的当前歌曲并同步歌曲信息和播放状态,之后每一次播放歌曲改变、播放状态改变以及歌单改变服务端都会对绑定的客户端进行通知( 通过服务绑定者注册监听实现)。

问题出现在Activity第一次同步的时候,因为服务启动过程中有一个耗时操作(通过 ContentResolver 获得设备上的歌曲信息),之后进行当前歌曲恢复,完成之后会立即回调songChanged(服务端当前歌曲改变时回调的方法),这个过程是在 Service 的 onCreate 中完成的,这时 Activity 肯定不能而且也不能够成功绑定服务(因为 Service 还在 onCreate ,ServiceConnection 的 onServiceConnected 也不会回调,也就无法通过 IBinder 注册监听),但我却只在songChanged方法中等待回调以进行初始同步,却没意识到这个回调已经发生了,而此时服务正在启动,且此时不可能有任何客户端绑定到服务;这个错误的解决方法是在 Activity 成功绑定到服务后手动获取当前歌曲及播放状态进行同步。

  1. 完全停止服务

PlayService服务会被两个 Activity 绑定,一个是主界面的 Activity(MainActivity),另一个为播放界面的 Activity(PlayActivity),停止时需要先让两个 Activity 解绑服务,之后让服务调用 stopSelf (通过发送广播实现)。

服务停止时需要释放 MediaPlayer;当时的问题是这样的,点击【退出】关闭应用,之后再次启动时,服务的 MediaPlayer 的 reset 方法抛出 IllegalStateException异常,这显然是因为 MediaPlayer 没有 release 导致的。我在应用【退出】操作的处理方法中是这样处

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值