取之于民、用之于民、最近总是在论坛索取、今天早上发现一个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。
简单说当我们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。
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、我个人觉得这会增加程序对资源的占有。不知道这个想法对不对哈。