android音乐播放器开发 SweetMusicPlayer 实现思路

来源:互联网 发布:大数据分析专业排名 编辑:程序博客网 时间:2024/05/18 02:37


代码地址: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


1 0
原创粉丝点击