主ACTIVITY
package wang.test;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Environment;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.SeekBar;
import android.widget.SimpleAdapter;
import android.widget.SeekBar.OnSeekBarChangeListener;
import android.widget.TextView;
import android.widget.Toast;
public class MusicPlayerActivity extends Activity implements OnClickListener {
private ImageButton play,stop,next;
private Button returnpath;
private TextView musictime,musicname,SDPath,playname;
private SeekBar sb;
private ListView listView;
private Myreceive myreceive;
private int playtime=0,time=0;
private File file;
private File[] musicfiles;
private static final int PLAY_ID=1,STOP_ID=2,NEXT_ID=3,SEEKBAR_ID=4,PAUSE_ID=5,ITEM_ID=6;
private Intent intentlist=new Intent("wang.test.pathlist");
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//获得控件ID
play=(ImageButton)findViewById(R.id.imageButton1);
stop=(ImageButton)findViewById(R.id.imageButton2);
next=(ImageButton)findViewById(R.id.imageButton3);
returnpath=(Button)findViewById(R.id.button1);
musicname=(TextView)findViewById(R.id.musicname);
musictime=(TextView)findViewById(R.id.musictime);
playname=(TextView)findViewById(R.id.textView2);
SDPath=(TextView)findViewById(R.id.textView4);
sb=(SeekBar)findViewById(R.id.seekBar1);
listView=(ListView)findViewById(R.id.listView1);
//监听按钮
play.setOnClickListener(this);
stop.setOnClickListener(this);
next.setOnClickListener(this);
//注册广播和启动服务
Intent intent=new Intent(this, PlayService.class);
startService(intent);
//文件浏览
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
file=Environment.getExternalStorageDirectory();
musicfiles=file.listFiles();
inflateListView(musicfiles);
}
//按键更改图标的广播
myreceive=new Myreceive();
IntentFilter filter=new IntentFilter("wang.test.returnAction");
registerReceiver(myreceive, filter);
//更新进度条和播放时间的广播
MyThreadUI threadUI=new MyThreadUI();
IntentFilter filter2=new IntentFilter("wang.test.returntask");
registerReceiver(threadUI, filter2);
//获取播放歌曲最大时间的广播,用于设定进度条最大值
Mymusictime mymusictime=new Mymusictime();
IntentFilter filter3=new IntentFilter("wang.test.returntime");
registerReceiver(mymusictime, filter3);
sb.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
Intent intent=new Intent("wang.test.buttonAction");
Bundle b=new Bundle();
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
b.putInt("ID", SEEKBAR_ID);
b.putInt("position", sb.getProgress());
intent.putExtra("data", b);
sendBroadcast(intent);
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
// TODO Auto-generated method stub
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress,
boolean fromUser) {
// TODO Auto-generated method stub
}
});
}
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent("wang.test.buttonAction");
final Bundle b=new Bundle();
switch (v.getId()) {
case R.id.imageButton1:
b.putInt("ID", PLAY_ID);
break;
case R.id.imageButton2:
b.putInt("ID", STOP_ID);
break;
case R.id.imageButton3:
b.putInt("ID", NEXT_ID);
break;
}
//进度条监听事件
intent.putExtra("data", b);
sendBroadcast(intent);
}
//接受服务返回的广播
private class Myreceive extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle b=intent.getBundleExtra("return_data");
switch (b.getInt("return_id")) {
case PAUSE_ID:
playname.setText("文件路径:"+b.getString("path"));
play.setImageResource(R.drawable.pause);
break;
case PLAY_ID:
play.setImageResource(R.drawable.play);
break;
}
}
}
private void inflateListView(File[] files)
{
// 创建一个List集合,List集合的元素是Map
final List<Map<String, Object>> listItems = new ArrayList<Map<String, Object>>();
ArrayList<String> pathlist=new ArrayList<String>();
for (int i = 0; i < files.length; i++)
{
Map<String, Object> listItem = new HashMap<String, Object>();
//如果当前File是文件夹,使用folder图标;否则使用file图标
if (files[i].isDirectory())
{
listItem.put("icon", R.drawable.folder);
listItem.put("fileName", files[i].getName());
}
else if (files[i].isFile()&& files[i].getName().endsWith("mp3") )
{
listItem.put("icon", R.drawable.musicicon);
listItem.put("fileName", files[i].getName());
try {
pathlist.add(files[i].getCanonicalPath());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
else{
listItem.put("icon", R.drawable.file);
listItem.put("fileName", files[i].getName());
}
listItems.add(listItem);
}
Bundle b=new Bundle();
b.putStringArrayList("list", pathlist);
intentlist.putExtra("listdata", b);
// 创建一个SimpleAdapter
SimpleAdapter simpleAdapter = new SimpleAdapter(this, listItems,
R.layout.listitem, new String[] { "icon", "fileName" }, new int[] {
R.id.imageView1, R.id.musicname });
// 为ListView设置Adapter
listView.setAdapter(simpleAdapter);
listView.setOnItemClickListener(new OnItemClickListener() {
Intent intent=new Intent("wang.test.buttonAction");
Bundle b=new Bundle();
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
if(musicfiles[arg2].isFile() && musicfiles[arg2].getName().endsWith("mp3") ){
try {
String path=musicfiles[arg2].getCanonicalPath();
b.putString("name",path);
b.putInt("ID", ITEM_ID);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
intent.putExtra("data", b);
sendBroadcast(intent);
sendBroadcast(intentlist);
}
if(musicfiles[arg2].isDirectory()){
File[] temp=musicfiles[arg2].listFiles();
if(temp==null || temp.length==0){
Toast.makeText(getApplicationContext(), "非MP3文件或者当前目录下没有文件", Toast.LENGTH_SHORT).show();
}
else{
file=musicfiles[arg2];
musicfiles=temp;
inflateListView(musicfiles);
}
}
}
});
returnpath.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
try {
if(!file.getCanonicalPath().equals(Environment.getExternalStorageDirectory().getAbsolutePath())){
file=file.getParentFile();
musicfiles=file.listFiles();
inflateListView(musicfiles);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
private class MyThreadUI extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle b=intent.getBundleExtra("return_data");
playtime=b.getInt("playtime");
sb.setProgress(playtime);
musictime.setText(getTimeShort(playtime));
}
public String getTimeShort(int time) {
SimpleDateFormat formatter = new SimpleDateFormat("mm:ss");
String dateString = formatter.format(time);
return dateString;
}
}
private class Mymusictime extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle b=intent.getBundleExtra("return_data");
time=b.getInt("time");
sb.setMax(time);
System.out.println("mmmmmmmmmmmmmmmmm"+time);
}
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
if(keyCode==KeyEvent.KEYCODE_BACK){
new AlertDialog.Builder(this)
.setTitle("提示")
.setMessage("确定退出吗?")
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent intent=new Intent(MusicPlayerActivity.this, PlayService.class);
stopService(intent);
System.exit(0);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
}
}).create().show();
}
return super.onKeyDown(keyCode, event);
}
}
音乐播放服务类
package wang.test;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.media.MediaPlayer.OnPreparedListener;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.IBinder;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.widget.Toast;
public class PlayService extends Service {
private static final int PLAY_ID=1,STOP_ID=2,NEXT_ID=3,SEEKBAR_ID=4,PAUSE_ID=5,ITEM_ID=6;
private MediaPlayer mp;
private boolean isplaying=true,ispause=false,isstop=true;
private Myreceiver myreceiver;
private ArrayList<String> pathlist=new ArrayList<String>();
private String temppath=null ,musicpath=null;
private TelephonyManager manager;
@Override
public void onCreate() {
// TODO Auto-generated method stub
mp=new MediaPlayer();
//注册按钮广播
myreceiver=new Myreceiver();
IntentFilter filter=new IntentFilter("wang.test.buttonAction");
registerReceiver(myreceiver, filter);
//注册列表广播
IntentFilter filter2=new IntentFilter("wang.test.pathlist");
Myreceiver2 myreceiver2=new Myreceiver2();
registerReceiver(myreceiver2, filter2);
//注册电话监听
manager=(TelephonyManager)this.getSystemService(this.TELEPHONY_SERVICE);
manager.listen(new MyphoneListener(), PhoneStateListener.LISTEN_CALL_STATE);
super.onCreate();
}
//更新播放列表
private class Myreceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle b=intent.getBundleExtra("listdata");
pathlist=b.getStringArrayList("list");
}
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return null;
}
//播放按钮,再点一次暂停
public void playing(){
Intent intent=new Intent("wang.test.returnAction");
Bundle b=new Bundle();
if(mp!=null){
if(isplaying==true){
mp.pause();
ispause=true;
isplaying=false;
b.putInt("return_id", PLAY_ID);
}
else if(ispause==true){
mp.start();
ispause=false;
isplaying=true;
b.putInt("return_id", PAUSE_ID);
}
else if(isplaying==false && isstop==true){
try {
mp.prepare();
mp.start();
isplaying=true;
isstop=false;
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
b.putInt("time", mp.getDuration());
}
intent.putExtra("return_data", b);
sendBroadcast(intent);
}
//播放文件
public void play(String path){
Intent intent2=new Intent("wang.test.returntime");
Bundle b2=new Bundle();
Intent intent=new Intent("wang.test.returnAction");
Bundle b=new Bundle();
if(mp!=null){
mp.reset();
try {
mp.setDataSource(path);
mp.prepare();
mp.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mp.start();
isplaying=true;
isstop=false;
}
});
mp.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
if(isplaying==true){
next();
}
}
});
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//发回广播更新播放状态以及获取的音乐文件最大值
b.putString("path", path);
b.putInt("return_id", PAUSE_ID);
b2.putInt("time", mp.getDuration());
intent.putExtra("return_data", b);
intent2.putExtra("return_data", b2);
sendBroadcast(intent);
sendBroadcast(intent2);
//启动线程更新进度条
Mythread mythread=new Mythread();
mythread.execute();
}
}
public void stop(){
Intent intent=new Intent("wang.test.returnAction");
Bundle b=new Bundle();
if(mp!=null){
mp.stop();
mp.reset();
isplaying=false;
isstop=true;
b.putInt("return_id", PLAY_ID);
b.putInt("time", mp.getDuration());
}
intent.putExtra("return_data", b);
sendBroadcast(intent);
}
//接收来自按钮的广播
private class Myreceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
Bundle b=intent.getBundleExtra("data");
switch (b.getInt("ID")) {
case PLAY_ID:
playing();
break;
case STOP_ID:
stop();
break;
case NEXT_ID:
next();
break;
case SEEKBAR_ID:
mp.seekTo(b.getInt("position"));
break;
case ITEM_ID:
musicpath=b.getString("name");
play(musicpath);
}
}
}
//下一首
public void next(){
if(pathlist.size()>0){
for(int i=0;i<pathlist.size();i++){
if(pathlist.get(i).equals(musicpath)){
if(i+1<pathlist.size()){
temppath=pathlist.get(i+1);
}
else {
temppath=pathlist.get(0);
}
}
}
musicpath=temppath;
play(musicpath);
}
}
//更新进度条的线程
private class Mythread extends AsyncTask<Void, Void, Void>{
Intent intent=new Intent("wang.test.returntask");
Bundle b=new Bundle();
@Override
protected Void doInBackground(Void... params) {
// TODO Auto-generated method stub
int i=0;
if(mp!=null){
while(i<mp.getDuration()){
i=mp.getCurrentPosition();
b.putInt("playtime", i);
intent.putExtra("return_data", b);
sendBroadcast(intent);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
return null;
}
}
//电话监听
private class MyphoneListener extends PhoneStateListener{
@Override
public void onCallStateChanged(int state, String incomingNumber) {
switch (state) {
case TelephonyManager.CALL_STATE_RINGING:
if(mp!=null){
mp.pause();
ispause=true;
isplaying=false;
}
break;
case TelephonyManager.CALL_STATE_IDLE:
if(mp!=null){
mp.start();
ispause=false;
isplaying=true;
}
}
super.onCallStateChanged(state, incomingNumber);
}
}
}
具体作用就是在主页面建立一个SD卡文件浏览器,显示SD卡下面所有的文件,并且给MP3文件设立独立的图标,点击列表就能实现播放