代码地址:https://github.com/huweigoodboy/SweetMusicPlayer

一,实现效果

目前还不是特别完善,主要有以下几个功能,
1,加载歌曲列表(实现a-z字母检索)
2,播放本地音乐
3,智能匹配本地歌词
4,智能加载在线歌词(其实不算智能,发现歌词迷api提供的歌词好多难以解析) 
5,摇一摇换歌功能
先上几张截图吧
另外,素材来自天天动听和百度音乐。。。毕竟作为一个码农,p图什么的太累。。。
楼主也是一介菜鸟,想记录一下做过的东西,做一个总结。

二,实现思路

1,主要界面设计

1)用tabs实现歌曲,最近,艺术家,专辑等分类,目前楼主只实现了歌曲部分。
2)主界面底部有个bottomactionbar用来操作歌曲状态,点击后弹出歌词播放界面。(这里必须要吐槽下,我目前的实现方案不是很好,用的最外层包裹的一层ScrollView,把歌词界面和歌曲界面放进去,操作时滚动到需要的界面位置,本想模仿天天动听可以把歌词界面拖拽出来,技术有限,弄了三四种方案,成了如今蹩脚的样子)
3)歌词界面,实现歌词部分,歌词调整进度。

2,主要实现思路

用一个MusicManager类控制播放器的主要事件及操作,然后广播通知ui控件更新。在MusicManager设置一个ListView成员变量作为当前播放的控件。
因为可能用户不通过歌曲列表播放,可能通过最近播放列表,艺术家列表等等。MusicManager包含各种状态以及操作,比如播放音乐,随机一个音乐,下一曲等等。
然后去通知播放音乐的service。先简单介绍一下吧,然后再总结具体实现。
package com.huwei.sweetmusicplayer.datamanager;import java.util.ArrayList;
import java.util.List;
import java.util.Random;import android.content.Context;
import android.content.Intent;import android.provider.MediaStore;import android.view.View;
import android.widget.BaseAdapter;
import android.widget.ListView;import com.huwei.sweetmusicplayer.enums.MusicState;
import com.huwei.sweetmusicplayer.models.Song;
import com.huwei.sweetmusicplayer.ui.fragments.PlayingFragment;public class MusicManager {private  int nowplaying_index=-1;public static boolean isPlaying=false;public static final String BOTTOMACTIONBAR_UPDATE="BOTTOMACTIONBAR_UPDATE";public static final String BOTTOMACTIONBAR_CHECKED="BOTTOMACTIONBAR_CHECKED";public static final String BOTTOMACTIONBAR_UNCHECKED="BOTTOMACTIONBAR_UNCHECKED";public static final String PLAY_BTN_CHECKED="PLAY_BTN_CHECKED";public static final String PLAY_BTN_UNCHECKED="PLAY_BTN_UNCHECKED";private static MusicManager instance;private Context context;private List<Song> songLists=new ArrayList<Song>();  //启动应用从数据库都进来时候的列表private ListView nowPlayingListView;      //正在播放音乐的列表控件/*** 定义查找音乐信息数组,0.标题,1音乐时间,2.艺术家,3.音乐id,4.显示名字,5.全路径,6,专辑ID,7最后添加时间。*/public static  String[] media_info = new String[] { MediaStore.Audio.Media.TITLE,MediaStore.Audio.Media.DURATION, MediaStore.Audio.Media.ARTIST,MediaStore.Audio.Media._ID, MediaStore.Audio.Media.DISPLAY_NAME,MediaStore.Audio.Media.DATA, MediaStore.Audio.Media.ALBUM_ID ,MediaStore.MediaColumns.DATE_ADDED};public static MusicManager getInstance(){if(null==instance){instance=new MusicManager();}return instance;}//加入song到songListspublic void addSong(Song song){songLists.add(song);}public void bind(Context context){this.context=context;}public void play(){Intent intent=new Intent();Song song=(Song) nowPlayingListView.getAdapter().getItem(nowplaying_index); intent.setAction("com.huwei.sweetmusicplayer.services.LocalMusicService");intent.putExtra("song", song);intent.putExtra("op", MusicState.PLAYING.ordinal());   //播放选项context.startService(intent);//通知playButtonIntent intent3=new Intent(PLAY_BTN_CHECKED);context.sendBroadcast(intent3);isPlaying=true;}//先停止,再播放public void restartPlay(){stopUnNotifyView();play();}public void previousSong(){setNowplaying_index(nowplaying_index-1);restartPlay();}public void nextSong(){//都要用set方法,便于通知更新视图setNowplaying_index(nowplaying_index+1);restartPlay();}//随机播放一首歌public void random_a_song(){getRandom_song();restartPlay();}public void pause(){Intent intent=new Intent();intent.setAction("com.huwei.sweetmusicplayer.services.LocalMusicService");intent.putExtra("op", MusicState.PAUSE.ordinal()); //播放选项context.startService(intent);isPlaying=false;//通知playButtonIntent intent3=new Intent(PLAY_BTN_UNCHECKED);context.sendBroadcast(intent3);}//发送停止音乐广播,但是不更新视图public void stopUnNotifyView(){Intent intent=new Intent();intent.setAction("com.huwei.sweetmusicplayer.services.LocalMusicService");intent.putExtra("op", MusicState.STOP.ordinal());    //播放选项context.startService(intent);}//停止音乐public void stop(){stopUnNotifyView();}//设置音乐进度public void setProgress(int progress){Intent intent=new Intent("com.huwei.sweetmusicplayer.services.LocalMusicService");intent.putExtra("progress", progress);intent.putExtra("op", MusicState.PROGRESS_CHANGE.ordinal());context.startService(intent);}//随机得到一首歌public int getRandom_song(){int random=new Random().nextInt(nowPlayingListView.getAdapter().getCount());setNowplaying_index(random);return nowplaying_index ;}public List<Song> getSongLists() {return songLists;}public int getNowplaying_index() {return nowplaying_index;}public void setNowplaying_index(int i) {int count=nowPlayingListView.getCount();nowplaying_index=(i+count)%count;//通知ListView控件刷新BaseAdapter adapter=(BaseAdapter) nowPlayingListView.getAdapter();adapter.notifyDataSetChanged();//通知bottomActionBar更新Intent intent=new Intent(BOTTOMACTIONBAR_UPDATE);context.sendBroadcast(intent);//通知PlaySong界面更新Intent intent2=new Intent(PlayingFragment.PLAYSONG_UPDATE);context.sendBroadcast(intent2);}public ListView getNowPlayingListView() {return nowPlayingListView;}public void setNowPlayingListView(ListView nowPlayingListView) {this.nowPlayingListView = nowPlayingListView;}public Song getNowPlayingSong(){return (Song) nowPlayingListView.getAdapter().getItem(nowplaying_index);}//歌词界面操作状态public  static  class OperateState{public static String READLRC_SUCCESS="READLRC_SUCCESS";public static String READLRC_LISTNULL="READLRC_LISTNULL";public static String READLRC_ONLINE="READLRC_ONLINE";public static String READLRCFILE_FAIL="READLRCFILE_FAIL";public static String READLRCONLINE_FAIL="READLRCONLINE_FAIL";}public Song getSongByIndex(int index){return (Song) nowPlayingListView.getAdapter().getItem(index);}
}
下一篇总结加载歌曲列表:http://blog.csdn.net/huweigoodboy/article/details/39856411

android音乐播放器开发 SweetMusicPlayer 实现思路相关推荐

  1. android音乐播放器开发 SweetMusicPlayer 载入歌曲列表

    上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...

  2. android音乐播放器开发 SweetMusicPlayer 加载歌曲列表

    上一篇写了播放器的整体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,现在来总结下加载歌曲列表. 代码地址:https: ...

  3. android音乐播放器开发 SweetMusicPlayer 播放本地音乐

    代码地址:https://github.com/huweigoodboy/SweetMusicPlayer 上一篇写了加载歌曲列表,http://blog.csdn.net/huweigoodboy/ ...

  4. android音乐播放器开发 SweetMusicPlayer 摇一摇换歌

    上一篇写了如何在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,现在来讲讲摇一摇功能开发. 代码地址:https:// ...

  5. android音乐播放器开发 SweetMusicPlayer 智能匹配本地歌词

    上一篇写了使用MediaPlayer播放音乐,http://blog.csdn.net/huweigoodboy/article/details/39861539. 代码地址:https://gith ...

  6. Android音乐播放器开发(5)—播放界面(播放、暂停、上一首、下一首,顺序播放、随机播放、拖拽进度条…)

    1. 说明 源码已同步到Gitee仓库,Github仓库,觉得还不错的话帮忙点个"star"吧,非常感谢. Android播放器专栏其它文章: 服务端:Android音乐播放器开发 ...

  7. Android音乐播放器开发(2)—登录

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  8. Android音乐播放器开发(3)—注册

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

  9. Android音乐播放器开发(4)—修改密码

    1. 说明 本音乐播放器基于Android开发,原为我和另外两个小伙伴在上学期间一起做的一个小项目,近来有时间整理一下.之前我有文章已经介绍了播放界面的功能实现(Android音乐播放器开发),但介绍 ...

最新文章

  1. 【MATLAB】三维图形的绘制mesh
  2. linux下内存测试mbw,【转帖】MBW内存测试
  3. ping命令时常碰到的问题
  4. AirPrint: 无交互的后台打印实现(Print without UI,iOS8+)
  5. 数据挖掘流程_数据流挖掘
  6. 论文阅读笔记:《Contextual String Embeddings for Sequence Labeling》
  7. linux7.3的域名配置表,Centos7.3 安装部署Nginx并配置https的方法步骤
  8. indesign自学教程,如何保存文档?
  9. Windows系统性能分析
  10. java ocx调用_Javascript调用OCX控件
  11. 在Winfrom中双击Ctrl键打开窗体
  12. 计算机网络原理思维导图
  13. Windows API、SDK和CRT的关系
  14. 用Django2.1开发易班联合登录
  15. 什么软件测试情侣头像,情侣头像搜索另一半 另一半情头查找器在线匹配 - 株洲娱乐网...
  16. Linux shell中21的含义解释 (全网最全,看完就懂)
  17. Mac VMWare键盘鼠标失灵
  18. contrastive loss 详解
  19. 【原创】Python 使用jmpy模块加密|加固 python代码
  20. Bzoj5109: [CodePlus 2017]大吉大利,晚上吃鸡!

热门文章

  1. 亚马逊云科技在中国区域新推多项服务;德州仪器携手台达打造高效能服务器电源供应器 | 全球TMT...
  2. Redis个人学习笔记 参考B站视频以及CSDN文档 2万多字 非常全面
  3. 习题3-5 三角形判断
  4. C#类的成员之Field(字段)
  5. Spring clud 微服务框架学习
  6. mysql 全局权限_mysql的大局权限GLOBAL PRIVILEGES
  7. PEMFC燃料电池机理模型
  8. Running “flutter pub get“ in xxxx... 解决方案
  9. 2019创业新项目手游充值代理是骗人的还是风口?
  10. 计算机在线给手机杀毒,国家计算机病毒应急处理中心曝光6款恶意应用 腾讯手机管家实现精准查杀...