本文介绍MediaPlayer的使用。MediaPlayer可以播放音频和视频,另外也可以通过VideoView来播放视频,虽然VideoView比MediaPlayer简单易用,但定制性不如用MediaPlayer,要视情况选择了。MediaPlayer播放音频比较简单,但是要播放视频就需要SurfaceView。SurfaceView比普通的自定义View更有绘图上的优势,它支持完全的OpenGL ES库。
1)如何获得MediaPlayer实例:
可以使用直接new的方式:
MediaPlayer mp = new MediaPlayer();
也可以使用create的方式,如:
MediaPlayer mp = MediaPlayer.create(this, R.raw.test);//这时就不用调用setDataSource了
2) 如何设置要播放的文件:
MediaPlayer要播放的文件主要包括3个来源:
a. 用户在应用中事先自带的resource资源
例如:MediaPlayer.create(this, R.raw.test);
b. 存储在SD卡或其他文件路径下的媒体文件
例如:mp.setDataSource("/sdcard/test.mp3");
c. 网络上的媒体文件
例如:mp.setDataSource("http://www.citynorth.cn/music/confucius.mp3");
MediaPlayer的setDataSource一共四个方法:
setDataSource (String path)
setDataSource (FileDescriptor fd)
setDataSource (Context context, Uri uri)
setDataSource (FileDescriptor fd, long offset, long length)
3)对播放器的主要控制方法:
属性/方法名: | 说明: |
create(Context context, Uri uri) | 静态方法,通过Uri创建一个多媒体播放器。 |
prepare() | 无返回值,准备同步 |
prepareAsync() | 无返回值,准备异步 |
getDuration() | 返回 Int,得到文件的以毫秒为单位的总持续时间 |
getCurrentPosition() | 返回 Int,得到文件的以毫秒为单位的当前位置 |
getVideoHeight() | 返回 Int ,得到视频的高度 |
getVideoWidth() | 返回 Int,得到视频的宽度 |
start() | 从头开始播放 |
stop(); | 无返回值,停止播放 |
pause(); | 暂停;如果在pause之后再调用start()是继续播放 |
reset(); | 无返回值,重置 MediaPlayer 对象 |
release() | 无返回值,释放 MediaPlayer 对象 |
seekTo(int msec) | 无返回值,指定播放的位置(以毫秒为单位的时间) seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。 |
isPlaying() | 返回 boolean,是否正在播放 |
isLooping() | 返回 boolean ,是否循环播放 |
setVolume(float leftVolume, float rightVolume) | 无返回值,设置音量 |
setDataSource (String path) setDataSource(FileDescriptor fd) setDataSource(Context context, Uri uri) setDataSource(FileDescriptor fd, long offset, long length) | 设置多媒体数据来源,根据:路径 FileDescriptor Uri
FileDescriptor |
setAudioStreamType(int streamtype) | 无返回值,指定流媒体的类型 |
setDisplay(SurfaceHolder sh) | 无返回值,设置用 SurfaceHolder 来显示多媒体 |
selectTrack(int index) | 此方法采用的整数,并选择该特定索引从列表中的轨道 |
getTrackInfo() | 这个方法返回轨道信息的数组 |
4)设置播放器的监听器:
MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,
如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)网络流媒体播放结束监听 、
setOnErrorListener(MediaPlayer.OnErrorListener listener)设置错误信息监听等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。
MediaPlayer另外常用监听:
setOnBufferingUpdateListener(MediaPlayer.OnBufferingUpdateListener listener) ;网络流媒体的缓冲监听
setOnVideoSizeChangedListener(MediaPlayer.OnVideoSizeChangedListener listener) 监听事件,视频尺寸监听
Android MediaPlayer基本使用方式
使用MediaPlayer播放音频或者视频的最简单例子:
Java代码部分:
public class MediaPlayerStudy extends Activity {
private Button bplay,bpause,bstop;
private MediaPlayer mp = new MediaPlayer();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bplay = (Button)findViewById(R.id.play);
bpause = (Button)findViewById(R.id.pause);
bstop = (Button)findViewById(R.id.stop);
bplay.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
try {
mp.setDataSource("/sdcard/test.mp3");
mp.prepare();
mp.start();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
mp.setOnCompletionListener(new OnCompletionListener(){
@Override
public void onCompletion(MediaPlayer mp) {
mp.release();
}
});
}
});
bpause.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(mp != null){
mp.pause();
}
}
});
bstop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
if(mp != null){
mp.stop();
}
}
});
}
@Override
protected void onDestroy() {
if(mp != null)
mp.release();
super.onDestroy();
}
}