1. MediaPlayer方法
MediaPlayer
创建
可以直接调用构造函数,利用setDataSource()
方法设置资源。
也可以调用MediaPlayer mp = new MediaPlayer(); // path可以是本地路径,也可以是网络地址 mp.setDataSource(String path);
create()
方法,create()
方法会直接调用prepare()
方法。MediaPlayer.create(Context context, int resid) MediaPlayer.create(Context context, Uri uri)
MediaPlayer
的控制方法prepare()/prepareAsync()
,提供了同步和异步两种方式设置播放器进入prepare
状态start()
,启动播放器播放pause()
,暂停播放器播放stop()
,停止播放器播放getCurrentPosition()
,当前播放器的时间seekTo(int)
,从指定位置开始播放release()
,释放播放器暂用资源reset()
,是播放器重回到Idle状态setLooping(boolean)
,设置是否循环播放
MediaPlayer
的监听器OnPreparedListener
,prepare/prepareAsync
结束时调用OnCompletionListener
,播放结束时调用OnSeekCompleteListener
,seekTo(int)
结束时调用
2. MediaPlayer状态间的转换
3. MediaPlayer播放音频
在onCreate(Bundle)
方法中创建MediaPlayer
,在onDestroy()
方法中销毁。
@Override
protected void onCreate(Bundle savedInstanceState) {... ...mMediaPlayer = new MediaPlayer();MediaPlayerListener listener = new MediaPlayerListener();mMediaPlayer.setOnPreparedListener(listener);mMediaPlayer.setOnCompletionListener(listener);
}@Override
protected void onDestroy() {super.onDestroy();mMediaPlayer.release();mMediaPlayer = null;
}private void createMediaPlayer() {mMediaPlayer.reset();try {AssetFileDescriptor fd = getAssets().openFd("demo.mp3");mMediaPlayer.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(), fd.getLength());mMediaPlayer.prepare();mMediaPlayer.start();} catch (IOException e) {LogTool.loge(LOG_TAG, e);}
}private void startMediaPlayer() {try {mMediaPlayer.start();} catch (IllegalStateException e) {LogTool.loge(LOG_TAG, e);}
}private void pauseMediaPlayer() {try {mMediaPlayer.pause();} catch (IllegalStateException e) {LogTool.loge(LOG_TAG, e);}
}public void stopMediaPlayer() {try {mMediaPlayer.stop();} catch (IllegalStateException e) {LogTool.loge(LOG_TAG, e);}
}private class MediaPlayerListener implements MediaPlayer.OnPreparedListener,MediaPlayer.OnCompletionListener {@Overridepublic void onPrepared(MediaPlayer mp) {}@Overridepublic void onCompletion(MediaPlayer mp) {}}
4. MediaPlayer播放视频
MediaPlayer
要和SurfaceView
配合播放视频,控制的方法和音频相同。
在SurfaceView
的SurfaceHolder
中添加一个回调类Callback
,在Callback.surfaceCreated(SurfaceHolder)
方法中调用MediaPlayer
的setDisplay(SurfaceHolder)
方法。
@Override
protected void onCreate(Bundle savedInstanceState) {... ...SurfaceHolder holder = mSurfaceView.getHolder();holder.addCallback(new SurfaceHolder.Callback() {@Overridepublic void surfaceCreated(SurfaceHolder holder) {// createMediaPlayer方法必须要等待Surface被创建以后调用createMediaPlayer();}@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {}@Overridepublic void surfaceDestroyed(SurfaceHolder holder) {}});mMediaPlayer = new MediaPlayer();MediaPlayerListener listener = new MediaPlayerListener();mMediaPlayer.setOnPreparedListener(listener);mMediaPlayer.setOnCompletionListener(listener);
}private void createMediaPlayer() {mMediaPlayer.reset();try {AssetFileDescriptor fd = getAssets().openFd("video.3gp");mMediaPlayer.setDataSource(fd.getFileDescriptor(),fd.getStartOffset(), fd.getLength());mMediaPlayer.prepare();mMediaPlayer.setDisplay(mSurfaceView.getHolder());mMediaPlayer.start();} catch (IOException e) {}
}
相关文章
Android MediaPlayer类
Android MediaCodec类