取之于民、用之于民、最近总是在论坛索取、今天早上发现一个Mediaplayer的小秘密、给大家共享一下、希望能对你们有用:
简单说当我们new 了一个Mediaplayer出来之后、进行try {
                                mp.setDataSource(path.get(Index));
mp.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();
}
    然后在后面的程序可能出出现再次对Mediaplayer进行try {
                                mp.setDataSource(path.get(Index));
mp.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();
}
    这个时候要想第二次的赋值成功:必须对该Mediaplayer进行reset(),因为在Mediaplayer已经有值得情况下是不会再次进行try的。至于为什么、我也不清楚、是试验总结出来得。他会报告一个警告、但是不会出错、会正常播放。
    那么这个情况会在哪儿遇到呢?播放器的播放按钮和、列表的单击播放效果。
程序在初始化的时候会对Mediaplayer进行try、保证在单击播放按钮的时候能播放第一首歌曲、然后在单击listview的时候要对Mediaplayer重新赋值、替换掉旧的数据、必须reset()一下。总结:reset(),stop(),new Mediaplayer(),之后能进行try。

解决方案 »

  1.   

    再来补一个小程序、眼见为实:
    MainActivity:
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;import android.media.MediaPlayer;
    import android.media.MediaPlayer.OnCompletionListener;
    import android.os.Bundle;
    import android.provider.MediaStore;
    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.ListView;
    import android.widget.TextView;
    import android.app.Activity;
    import android.database.Cursor;public class MainActivity extends Activity {
    private Button button01,button02,button03,button04,button05;
    private ListView list;
    private MediaPlayer mp;
    private TextView text;
    final static int PAUSE=2,PLAY=1,STOP=3,NEXT=4,LAST=5;
    int Index=0;
    private List<String> id,name,path;
    private String[] tiaojian={
    MediaStore.Audio.Media._ID,
    MediaStore.Audio.Media.DISPLAY_NAME,
    MediaStore.Audio.Media.DATA,
    };
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            button01=(Button)findViewById(R.id.play);
            button02=(Button)findViewById(R.id.pause);
            button03=(Button)findViewById(R.id.stop);
            button04=(Button)findViewById(R.id.last);
            button05=(Button)findViewById(R.id.next);
            list=(ListView)findViewById(R.id.list);
            text=(TextView)findViewById(R.id.music_name);
            button01.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    content(PLAY);
    }
    });
            button02.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    content(PAUSE);
    }
    });
            button03.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    content(STOP);
    }
    });
            button04.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    content(LAST);
    }
    });
            button05.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
    // TODO Auto-generated method stub
    content(NEXT);
    }
    });
            
            mp=new MediaPlayer();
            setlist();
            
            list.setOnItemClickListener(new OnItemClickListener() { @Override
    public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
    long arg3) {
    // TODO Auto-generated method stub
    Index=arg2;
    mp.reset();//大家可以去掉试试效果。。
    content(PLAY);
    }
    });
        }
        private void setlist(){
         Cursor c=doquery();
         if(c.getCount()>0){
         id=new ArrayList<String>();
         name=new ArrayList<String>();
         path=new ArrayList<String>();
         for(int i=0;i<c.getCount();i++){
         c.moveToPosition(i);
         id.add(c.getString(c.getColumnIndex(MediaStore.Audio.Media._ID)));
         name.add(c.getString(c.getColumnIndex(MediaStore.Audio.Media.DISPLAY_NAME)));
         path.add(c.getString(c.getColumnIndex(MediaStore.Audio.Media.DATA)));
         }
         System.out.println(name.get(0));
         list.setAdapter(new listadapter(this,id,name));
        
         }
        }
        private Cursor doquery(){
    Cursor c=this.getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, tiaojian, null, null, null);
    return c;
        }    public void content(int id){
         switch (id) {
    case PAUSE:
    mp.pause();
    //mp.reset();
    break;
    case STOP:
    mp.stop();
    break;
    case LAST:
    if(--Index < 0){
    Index=name.size()-1;

    }System.out.println("Index--");
    mp.reset();//大家可以去掉试试效果。。
    break;
    case NEXT:
    if(++Index >= name.size()){
    Index=0;

    }System.out.println("Index++");
    mp.reset();//大家可以去掉试试效果。。
    break;
    }
    if(id==PLAY||id==LAST||id==NEXT){
         try {
    mp.setDataSource(path.get(Index));
    mp.prepare();
    System.out.println(Index);
    } 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();
    }
         mp.start();
         }
    mp.setOnCompletionListener(new OnCompletionListener() {

    @Override
    public void onCompletion(MediaPlayer mp) {
    // TODO Auto-generated method stub
    //mp.reset();
    content(NEXT);
    System.out.println("下一曲");
    }
    });


         }
    @Override
        public void onDestroy(){
    super.onDestroy();
         if(mp.isPlaying()){
         mp.stop();
         mp.release();
         }
        }
    }
    listadapter:
    import java.util.ArrayList;
    import java.util.List;import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.TextView;public class listadapter extends BaseAdapter {

    private List<String> id,name;
    private Context context;

    public listadapter(Context context,List<String> id,List<String> name){
    this.id=new ArrayList<String>();
    this.name=new ArrayList<String>();
    this.id=id;
    this.name=name;
    this.context=context;
    }
    static class ViewHolder {   
    TextView text01;   
    TextView text02;   
    }    @Override
    public int getCount() {
    // TODO Auto-generated method stub
    return id.size();
    } @Override
    public Object getItem(int position) {
    // TODO Auto-generated method stub
    return name.get(position);
    } @Override
    public long getItemId(int position) {
    // TODO Auto-generated method stub
    return position;
    } @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    ViewHolder holder=new ViewHolder();
    if(convertView==null){
    convertView=LayoutInflater.from(context).inflate(R.layout.row, null);
    holder.text01=(TextView)convertView.findViewById(R.id.id);
    holder.text02=(TextView)convertView.findViewById(R.id.name);
    convertView.setTag(holder);
    }else{
    holder=(ViewHolder) convertView.getTag();
    }
    holder.text01.setText(id.get(position));
    String[] content=name.get(position).split(".mp3");
    holder.text02.setText(content[0].length()>16?content[0].substring(0, 14):content[0]);
    return convertView;
    }
    }
    XML就不贴了。布局就是播放、暂停、上一曲、下一曲的按钮、然后加一个listview列表显示歌曲名称。最后:我的思想是尽量不去release()、然后在new一个Mediaplayer、我个人觉得这会增加程序对资源的占有。不知道这个想法对不对哈。