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 {
@Override
public void onPrepared(MediaPlayer mp) {
}
@Override
public 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() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
// createMediaPlayer方法必须要等待Surface被创建以后调用
createMediaPlayer();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public 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) {
}
}