android音乐播放器开发 SweetMusicPlayer 实现思路
一,实现效果
。
。
二。实现思路
1。主要界面设计
2,主要实现思路
在MusicManager设置一个ListView成员变量作为当前播放的控件。
MusicManager包括各种状态以及操作,比方播放音乐。随机一个音乐。下一曲等等。
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到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<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);
}
}
android音乐播放器开发 SweetMusicPlayer 实现思路的更多相关文章
- android音乐播放器开发 SweetMusicPlayer 载入歌曲列表
上一篇写了播放器的总体实现思路,http://blog.csdn.net/huweigoodboy/article/details/39855653,如今来总结下载入歌曲列表. 代码地址:https: ...
- android音乐播放器开发 SweetMusicPlayer 播放本地音乐
上一篇写了载入歌曲列表,http://blog.csdn.net/huweigoodboy/article/details/39856411,如今来总结下播放本地音乐. 一,MediaPlayer 首 ...
- android音乐播放器开发 SweetMusicPlayer
智能负载直插式歌词
在一份书面的使用MediaPlayer播放音乐, http://blog.csdn.net/huweigoodboy/article/details/39862773.假设没有本地歌词怎么办?如今来将 ...
- android音乐播放器开发 SweetMusicPlayer 摇一摇换歌
上一篇写了怎样在线匹配歌词,http://blog.csdn.net/huweigoodboy/article/details/39878063,如今来讲讲摇一摇功能开发. 相同用了一个Service ...
- android音乐播放器开发 SweetMusicPlayer 智能匹配本地歌词
上一篇写了使用MediaPlayer播放音乐,http://blog.csdn.net/huweigoodboy/article/details/39861539. 代码地址:https://gith ...
- android音乐播放器开发教程
android音乐播放器开发教程 Android扫描sd卡和系统文件 Android 关于录音文件的编解码 实现米聊 微信一类的录音上传的功能 android操作sdcard中的多媒体文件——音乐列表 ...
- Android音乐播放器开发
今日看书,看到这个播放器,我就写了个例子,感觉还行,这个播放器能播放后缀是.MP3的音乐,这个例子在main.xml设置listView的时候,注意:android:id="@+id/and ...
- Android音乐播放器源码(歌词.均衡器.收藏.qq5.0菜单.通知)
一款Android音乐播放器源码,基本功能都实现了 qq5.0菜单(歌词.均衡器.收藏.qq5.0菜单.通知) 只有向右滑动出现,菜单键和指定按钮都还没有添加. 源码下载:http://code.66 ...
- 一款非常简单的android音乐播放器源码分享给大家
一款非常简单的android音乐播放器源码分享给大家,该应用虽然很小,大家常用的播放器功能基本实现了,可能有点还不够完善,大家也可以自己完善一下,源码在源码天堂那里已经有了,大家可以到那里下载学习吧. ...
随机推荐
- C#总结项目《影院售票系统》编写总结完结篇
回顾:昨天总结了影院售票系统核心部分-售票,整个项目也就完成了2/3了,需求中也要求了对销售信息的保存,今天就继续总结销售信息的保存以及加载销售信息. 分析:退出程序时将已售出票集合中的对象循环写入到 ...
- TFS统计编码行数语句
****** Script for SelectTopNRows command from SSMS ******/ SELECT TeamProjectProjectNodeName 项目名称 ,c ...
- java.lang.NumberFormatException: empty String 错误
原因:前台获取的字符串,后台类型转换,与之对应的实体类中却是Integer类型,所以会报错. 排错情况:1.先检查数据库与实体类中的类型是否一致 2.检查类型转换代码,如果需要加入异常处理
- [转]C++ list 类学习笔记
双向循环链表list list是双向循环链表,,每一个元素都知道前面一个元素和后面一个元素.在STL中,list和vector一样,是两个常被使用的容器.和vector不一样的是,list不支持对元素 ...
- Eclipse导入JavaWeb项目报错:The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path
JavaWeb项目中写的JSP页面需要Web容器解析处理成HTML才能展示到前端浏览器,解析JSP需要Web容器.JSP页面顶端出现“红色”的报错信息:The superclass "jav ...
- javascript DOM对象转jquery对象
首先,假设一种情形:要在HTML文件中为一个select对象添加一个函数,这个函数的名字叫dynamic_change(this),当select的option被改变的时候调用onchange事件来处 ...
- css3动画和jquery动画使用中要注意的问题
前一阵子写demo的时候遇到这样一个问题,就是给元素添加css3或者jquery动画时,在动画结束前不能准确取到元素的css属性. 1. css3动画讨论 先看代码: html: <div id ...
- Css3动态伪类
通常我们可以用CSS中伪类和js中的鼠标事件来定义. 动态伪类 起作用的元素 描述 :link 只有链接 未访问的链接 :visited 只有链接 访问过的链接 :hover 所有元素 鼠标经过元素 ...
- JQuery+Js 获取浏览器高度和宽度
JQuery-------做手机Web开发做浏览器兼容用到了,所以在网上找了些汇总下. alert($(window).height()); //浏览器当前窗口可视区域高度 alert($(docum ...
- linux磁盘空间用满的处理方法
linux下空间满可能有两种情况 可以通过命令 df -h 查看磁盘空间占用,实际上是查看磁盘块占用的文件(block) df -i 查看索引节点的占用(Inodes) 磁盘块和索引节点其中之一满 ...