这次的版本,做了许多的改变,增加了SeekBar进度条,上一首,下一首,以及长按Item删除歌曲的功能。当然也是还有bug的,另外UI也是做了适当的美化。本章节的主要知识点是BroadcastReceiver,自定义简单listView适配器,以及handler更新界面。基本的音乐播放器功能都已经实现。
下面贴出关键代码
首先是创建一个全局变量类
Data.java
package com.android.MyMediaPlayer;
import android.app.Application;
public class Data extends Application {
private int index;
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
@Override
public void onCreate() {
super.onCreate();
index = 0;
}
}
添加这个全局变量index是为了在不同的类里引用它时更方便,它记录了音乐播放的下标,初始化为0,代表默认播放第一首音乐。
要使用这个全局变量类请在配置文件里添加
还有就是我写了一点点的自定义listView数据适配器
主要重写了getView()方法。
MySimpleAdapter.java
package com.android.MyMediaPlayer;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.SimpleAdapter;
public class MySimpleAdapter extends SimpleAdapter {
int mSelect = 0; // 选中项
private Context context;
private Data appData;
public void changeSelected(int positon) { // 刷新方法
if (positon != mSelect) {
mSelect = positon;
appData.setIndex(positon);
notifyDataSetChanged();
}
}
public MySimpleAdapter(Context context,
List<? extends Map<String, ?>> data, int resource, String[] from,
int[] to) {
super(context, data, resource, from, to);
this.context = context;
appData=(Data) context.getApplicationContext();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater factory = LayoutInflater.from(context);
View v;
v = (View) factory.inflate(R.layout.music_list_item, null);
if (mSelect == position) {
// v.setBackgroundResource(R.drawable.top_bak); // 选中项背景
} else {
v.setBackgroundResource(R.drawable.transparent); // 其他项背景
}
if (appData.getIndex()==position) {
v.setBackgroundResource(R.drawable.top_bak);
}
return super.getView(position, v, parent);
}
}
我的获取本地音乐是用的别人代码,网上这类很多,我用的是调用系统本地媒体库,可以读出许多数据。想具体了解可以百度,源码我就不贴了,下面有下载,不用分~
还有一个关键就是,我这里使用到了广播,是用来让Seekbar动起来的
我把广播写在了服务里,向activity里传值
Runnable updatesb = new Runnable() {
public void run() {
// 每100豪秒更新一次
Intent intent = new Intent();
intent.putExtra("mTime", player.getCurrentPosition());
intent.putExtra("mMaxTime", player.getDuration());
intent.setAction(MUSIC_TIME);
sendBroadcast(intent);
mPercentHandler.postDelayed(updatesb, 100);
}
};
activity里设置一个广播接收器
private int maxMusicTime = 0;
private int musicTime = 0;
private BroadcastReceiver MusicTime = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (action != null) {
if (action.equals(MusicService.MUSIC_TIME)) {
maxMusicTime = intent.getExtras().getInt("mMaxTime");
musicTime = intent.getExtras().getInt("mTime");
int sMax = seekBar_music.getMax();
textView_now.setText(musicTime / 1000 + "秒");
textView_total.setText(maxMusicTime / 1000 + "秒");
seekBar_music.setProgress(musicTime * sMax / maxMusicTime);
}
}
}
};
使用广播不要忘了注册
而且在退出Activity时取消注册
// 注册广播
private void registerBoradcastReceiver() {
intentFilter = new IntentFilter();
intentFilter.addAction(MusicService.MUSIC_TIME);
registerReceiver(MusicTime, intentFilter);
}
本次关键代码就到此结束,希望大家一起进步,下面贴出下载源码地址