博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android音乐播放器开发 SweetMusicPlayer 实现思路
阅读量:6197 次
发布时间:2019-06-21

本文共 5727 字,大约阅读时间需要 19 分钟。

 一,实现效果

眼下还不是特别完好,主要有下面几个功能,
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
songLists=new ArrayList
(); //启动应用从数据库都进来时候的列表 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到songLists public 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); //通知playButton Intent 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; //通知playButton Intent 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
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); }}
下一篇总结载入歌曲列表:
你可能感兴趣的文章
Apache CXF 框架结构和基本原理
查看>>
程序员开发常用英语词汇
查看>>
Class
查看>>
YARN中内存的设置
查看>>
Django admin 自定制
查看>>
随机ID添加
查看>>
Htmlparser专题
查看>>
1060. 爱丁顿数(25)
查看>>
meizu mx2 android adb driver install
查看>>
序列号
查看>>
第四十一天
查看>>
SQL查询数据时报错
查看>>
eclipse code style template
查看>>
oracle数据库的随堂笔记(四)-定义并使用变量
查看>>
了不起的分支和循环01 - 零基础入门学习Python007
查看>>
[2669]2-2 Time类的定义
查看>>
Add Two Numbers
查看>>
java基础----泛型!
查看>>
Unicode
查看>>
用VS2010编C#程序扫盲
查看>>