首先是主函数:
package com.example.mymediaplayer4;import java.util.ArrayList;import android.os.Bundle;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.TextView;public class MainActivity extends Activity {
private Button last,next;
private ImageButton play,pause,stop;
private TextView musicName;
private ListView musicList;
private MainReceiver mainreceiver;
private ArrayList<String> musicname=new ArrayList<String>();
public static final String main="MAIN_RECEIVER";
public static final String musicservice="MUSIC_RECEIVER";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        contentView();
        
        IntentFilter intentfilter=new IntentFilter();
        intentfilter.addAction(main);
        mainreceiver=new MainReceiver();
        registerReceiver(mainreceiver, intentfilter);
        
        Intent intent=new Intent();
        intent.setClass(this, musicService.class);
        startService(intent);
        
        last.setOnClickListener(new listener());
        next.setOnClickListener(new listener());
        play.setOnClickListener(new listener());
        pause.setOnClickListener(new listener());
        stop.setOnClickListener(new listener());
        
        musicList.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
Intent intent=new Intent();
intent.setAction(musicservice);
intent.putExtra("key", (int)arg3);
intent.putExtra(musicService.Mark, 7);
sendBroadcast(intent);

System.out.println(arg3);
}
});
    }
    public class listener implements android.view.View.OnClickListener{
     Intent intent=new Intent(musicservice);
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.last:
intent.putExtra(musicService.Mark, 2);
break;
case R.id.play:
intent.putExtra(musicService.Mark, 3);
break;
case R.id.pause:
intent.putExtra(musicService.Mark, 4);
break;
case R.id.stop:
intent.putExtra(musicService.Mark, 5);
break;
case R.id.next:
intent.putExtra(musicService.Mark, 6);
break;

default:

break;
}
sendBroadcast(intent);
}
    
    }
private void contentView(){
last=(Button)findViewById(R.id.last);
next=(Button)findViewById(R.id.next);
last.setText(" << ");
next.setText(" >> ");
play=(ImageButton)findViewById(R.id.play);
pause=(ImageButton)findViewById(R.id.pause);
stop=(ImageButton)findViewById(R.id.stop);
musicName=(TextView)findViewById(R.id.musicname);
musicList=(ListView)findViewById(R.id.list);
}
private class MainReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
int Mark=arg1.getIntExtra(musicService.Mark, 0);
switch (Mark) {
case 1:
Bundle bu=arg1.getExtras();
musicname=bu.getStringArrayList("musicname");
showlist(musicname);
break;
case 2:
play.setEnabled(false);
pause.setEnabled(true);
stop.setEnabled(true);
musicName.setText(arg1.getStringExtra("name"));
break;
case 3:
play.setEnabled(false);
pause.setEnabled(true);
stop.setEnabled(true);
musicName.setText(arg1.getStringExtra("name"));
break;

case 4:
play.setEnabled(true);
pause.setEnabled(false);
stop.setEnabled(true);
break;
case 5:
play.setEnabled(true);
pause.setEnabled(false);
stop.setEnabled(false);
break;
case 6:
play.setEnabled(false);
pause.setEnabled(true);
stop.setEnabled(true);
musicName.setText(arg1.getStringExtra("name"));
break;
case 7:

break; default:
break;
}

}
}
public void showlist(ArrayList<String> musicname){
ArrayList<String> name=new ArrayList<String>();
for(int i=0;i<musicname.size();i++){
name.add(musicname.get(i).length()>20 ? musicname.get(i).substring(0, 20)+"..." : musicname.get(i));
}
ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, name);
musicList.setAdapter(adapter);
}
@Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
@Override
public boolean onKeyDown(int keyCode,KeyEvent event){
if(keyCode==KeyEvent.KEYCODE_BACK){
System.out.println("onkeyDown");
unregisterReceiver(mainreceiver);
this.finish();
}
return super.onKeyDown(keyCode, event);
}
}
文件过滤器:
package com.example.mymediaplayer4;import java.io.File;
import java.io.FilenameFilter;public class myfile implements FilenameFilter { @Override
public boolean accept(File dir, String filename) {
// TODO Auto-generated method stub
String name=filename.toLowerCase();
return  (name.endsWith(".mp3")||name.endsWith(".wav"));
}}

解决方案 »

  1.   

    然后是musicservice:
    package com.example.mymediaplayer4;import java.io.File;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;import android.app.AlertDialog.Builder;
    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.OnErrorListener;
    import android.os.Bundle;
    import android.os.Environment;
    import android.os.IBinder;public class musicService extends Service {
    private static final String home=Environment.getExternalStorageDirectory().getAbsolutePath().toString().trim();
    private String musichome=home+File.separator+"music";
    private ArrayList<String> musicpath,musicname;
    private MusicReceiver musicreceiver;
    private MediaPlayer mplayer;
    private Intent intent;
    private int Index=0;
    public static final String Mark="";
    @Override
    public IBinder onBind(Intent intent) {
    // TODO Auto-generated method stub
    return null;
    }
    @Override
    public void onCreate(){
    super.onCreate();
    System.out.println("onCreate!");
    mplayer=new MediaPlayer();
    mplayer.setOnCompletionListener(new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
    // TODO Auto-generated method stub
    next();
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 6);
    intent.putExtra("name", musicname.get(Index));
    sendBroadcast(intent);
    }
    });
    mplayer.setOnErrorListener(new OnErrorListener() {

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {
    // TODO Auto-generated method stub
    System.out.println("Error!");
    next();
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 6);
    intent.putExtra("name", musicname.get(Index));
    sendBroadcast(intent);
    return true;
    }
    });

    musicpath=new ArrayList<String>();
    musicname=new ArrayList<String>();

    IntentFilter intentfilter=new IntentFilter();
    intentfilter.addAction(MainActivity.musicservice);
    musicreceiver=new MusicReceiver();
    registerReceiver(musicreceiver, intentfilter);

    File file=new File(musichome);
    File[] files=file.listFiles(new myfile());
    if(files.length>0){
    for(File f:file.listFiles(new myfile())){
    musicpath.add(f.getPath());
    musicname.add(f.getName());
    System.out.println(f.getPath());
    System.out.println(f.getName());
    }
    }


    }
    @Override
    public void onStart(Intent intent,int startId){
    super.onStart(intent, startId);
    System.out.println("onStart!");
    System.out.println(musicname.get(Index));
    intent=new Intent();
    if(mplayer.isPlaying()){
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 3);
    intent.putExtra("name", musicname.get(Index));
    sendBroadcast(intent);
    }

    intent.setAction(MainActivity.main);
    Bundle bu=new Bundle();
    bu.putStringArrayList("musicname", musicname);
    intent.putExtras(bu);
    intent.putExtra(Mark, 1);
    sendBroadcast(intent);
    }
    @Override
    public void onDestroy(){
    super.onDestroy();
    System.out.println("onDestroy!");
    mplayer.release();
    }
    public class MusicReceiver extends BroadcastReceiver{ @Override
    public void onReceive(Context context, Intent intent) {
    // TODO Auto-generated method stub
    int key=intent.getIntExtra(Mark, 0);
    switch (key) {
    case 2:
    last();
    System.out.println("last="+Index);
    System.out.println("musicname="+musicname.size());

    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 2);
    intent.putExtra("name", musicname.get(Index));
    break;
    case 3:
    playing();
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 3);
    intent.putExtra("name", musicname.get(Index));
    break;
    case 4:
    if(mplayer.isPlaying())
    mplayer.pause();
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 4);
    break;
    case 5:
    mplayer.stop();
    mplayer.reset();
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 5);
    break;
    case 6:
    next();
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 6);
    intent.putExtra("name", musicname.get(Index));
    break;
    case 7:
    mplayer.reset();
    Index=intent.getIntExtra("key", 0);
    playing();
    intent.setAction(MainActivity.main);
    intent.putExtra(Mark, 3);
    intent.putExtra("name", musicname.get(Index));
    break;
    default:
    break;
    }
    sendBroadcast(intent);
    }

    }
    private void last(){
    if(Index-1<0)
    Index=musicname.size()-1;
    else
    Index=Index-1;
    mplayer.reset();
    playing();

    }
    private void next(){
    if(Index+1>=musicname.size())
    Index=0;
    else
    Index=Index+1;
    mplayer.reset();
    playing();


    }
    private void playing(){
    try {
    mplayer.setDataSource(musicpath.get(Index));
    mplayer.prepare();
    } 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();
    }
    mplayer.start();
    }
    }
      

  2.   

    界面:
    然后我再说说问题:在歌曲列表中有一首歌不能播放、我写了 mplayer.setOnErrorListener(new OnErrorListener() {                         @Override            public boolean onError(MediaPlayer mp, int what, int extra) {                // TODO Auto-generated method stub                System.out.println("Error!");                next();                intent.setAction(MainActivity.main);                intent.putExtra(Mark, 6);                intent.putExtra("name", musicname.get(Index));                sendBroadcast(intent);                return true;            }        });
    在System.out.println()里面也显示执行了的,但还是出现了错误:
    12-27 18:02:17.979: D/AndroidRuntime(17519): Shutting down VM
    12-27 18:02:17.979: W/dalvikvm(17519): threadid=1: thread exiting with uncaught exception (group=0x40018578)
    12-27 18:02:17.989: E/AndroidRuntime(17519): FATAL EXCEPTION: main
    12-27 18:02:17.989: E/AndroidRuntime(17519): java.lang.NullPointerException
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at com.example.mymediaplayer4.musicService$2.onError(musicService.java:59)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at android.media.MediaPlayer$EventHandler.handleMessage(MediaPlayer.java:1472)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at android.os.Handler.dispatchMessage(Handler.java:99)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at android.os.Looper.loop(Looper.java:130)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at android.app.ActivityThread.main(ActivityThread.java:3687)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at java.lang.reflect.Method.invokeNative(Native Method)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at java.lang.reflect.Method.invoke(Method.java:507)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    12-27 18:02:17.989: E/AndroidRuntime(17519):  at dalvik.system.NativeStart.main(Native Method)