MediaPlayer具有非常强大的功能:
在MediaPlayer中,根据数据源为元数据、音频文件、音频流的不同情况,有着相应的处理过程。基本的过程如下:
1)播放元数据
如果元数据位于Android工程的“res/raw”文件夹下。播放元数据的过程为:
MediaPlayer mp=MediaPlayer.create(context, R.raw.sound_file_1);
mp.start();
2)播放音频文件
如果音频文件的路径为PATH_TO_FILE,播放音频文件的过程为:
MediaPlayer mp=new MediaPlayer();
mp.setDataSource(PATH_TO_FILE); //设置数据源
mp.prepare();
mp.start();
m_mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),fileDescriptor.getStartOffset(), fileDescriptor.getLength());
3)播放音频流
如果音频文件的URL地址为URL_ADRESS,播放音频流的过程为:
MediaPlayer mp=new MediaPlayer();
mp.setDataSource(URL_ADRESS); //设置数据源
mp.prepare();
mp.start();
list的保存文件路径方式 ,最好在每次播放时都reset() 然后在onPreparelistener监听器中启动start()方法。
备注:对音视频的播放均提供了支持,为了保证播放期间系统的屏幕一直工作,需要设置"android.permission.WAKE_LOCK"权限。如果要访问sd卡,还要加sd卡读写权限。
代码实例:
public class MainActivity extends Activity {
private static final String TAG = "PlayerActivity";
private EditText filenameText;
private MediaPlayer mediaPlayer;
private SurfaceView surfaceView;
private int position = 0;
private int index = 1;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mediaPlayer = new MediaPlayer();
filenameText = (EditText)this.findViewById(R.id.filename);
surfaceView = (SurfaceView) this.findViewById(R.id.surfaceView);
surfaceView.getHolder().setFixedSize(176, 144);//设置分辨率
surfaceView.getHolder().setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
surfaceView.getHolder().addCallback(new SurfaceCallback());
ButtonClickListener listener = new ButtonClickListener();
ImageButton playButton = (ImageButton)this.findViewById(R.id.play);
ImageButton pauseButton = (ImageButton)this.findViewById(R.id.pause);
ImageButton resetButton = (ImageButton)this.findViewById(R.id.reset);
ImageButton stopButton = (ImageButton) this.findViewById(R.id.stop);
playButton.setOnClickListener(listener);
pauseButton.setOnClickListener(listener);
resetButton.setOnClickListener(listener);
stopButton.setOnClickListener(listener);
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
File videoFile = new File(Environment.getExternalStorageDirectory(), "intro.mp4");
}
});
mediaPlayer.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
mediaPlayer.start();//播放
}
});
}
private final class SurfaceCallback implements SurfaceHolder.Callback{
@Override
public void surfaceCreated(SurfaceHolder holder) {
try {
play();
mediaPlayer.seekTo(position);
position = 0;
} catch (IOException e) {
Log.e(TAG, e.toString());
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width,
int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if(mediaPlayer.isPlaying()){
position = mediaPlayer.getCurrentPosition();
mediaPlayer.stop();
}
}
}
private final class ButtonClickListener implements View.OnClickListener{
@Override
public void onClick(View v) {
if(!Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
//Toast.makeText(PlayerActivity.this, R.string.sdcarderror, 1).show();
return;
}
try {
switch (v.getId()) {
case R.id.play:
play();
break;
case R.id.pause:
if(mediaPlayer.isPlaying()){
mediaPlayer.pause();
}else{
mediaPlayer.start();
}
break;
case R.id.reset:
if(mediaPlayer.isPlaying()){
mediaPlayer.seekTo(0);
}else{
play();
}
break;
case R.id.stop:
if(mediaPlayer.isPlaying()) mediaPlayer.stop();
break;
}
} catch (Exception e) {
Log.e(TAG, e.toString());
}
}
}
private void play() throws IOException {
String value = "intro.mp4";
if(index == 2) {
value = "lenovotechcity1920 [Android 720p AVC].mp4";
index = 0;
}
final File videoFile = new File(Environment.getExternalStorageDirectory(), value);
mediaPlayer.reset();//重置为初始状态
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
/* 设置Video影片以SurfaceHolder播放 */
mediaPlayer.setDisplay(surfaceView.getHolder());
mediaPlayer.setDataSource(videoFile.getAbsolutePath());
mediaPlayer.setOnCompletionListener(new OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
// TODO Auto-generated method stub
try {
mediaPlayer.setDataSource(videoFile.getAbsolutePath());
index++;
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SecurityException 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.setOnPreparedListener(new OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// TODO Auto-generated method stub
try {
mediaPlayer.prepare();
} catch (IllegalStateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}//缓冲
mediaPlayer.start();//播放
}
});
Log.i(TAG, videoFile.getAbsolutePath());
mediaPlayer.prepare();//缓冲
mediaPlayer.start();//播放
mediaPlayer.setLooping(true);
}
private void onComplationListener() {
// TODO Auto-generated method stub
}
}