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();
}
}
布局文件main.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="@string/hello" />
<Button android:text="play" android:id="@+id/play"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Button android:text="pause" android:id="@+id/pause"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
<Button android:text="stop" android:id="@+id/stop"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></Button>
</LinearLayout>
程序说明:
这个例子只是描述了MediaPlayer的基本使用步骤和方式,MediaPlayer还有多种使用方式和方法,并不只局限于例子所介绍的一种。具体来看:
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)对播放器的主要控制方法:
Android通过控制播放器的状态的方式来控制媒体文件的播放,其中:
prepare()和prepareAsync() 提供了同步和异步两种方式设置播放器进入prepare状态,需要注意的是,如果MediaPlayer实例是由create方法创建的,那么第一次启动播放前不需要再调用prepare()了,因为create方法里已经调用过了。
start()是真正启动文件播放的方法,
pause()和stop()比较简单,起到暂停和停止播放的作用,
seekTo()是定位方法,可以让播放器从指定的位置开始播放,需要注意的是该方法是个异步方法,也就是说该方法返回时并不意味着定位完成,尤其是播放的网络文件,真正定位完成时会触发OnSeekComplete.onSeekComplete(),如果需要是可以调用setOnSeekCompleteListener(OnSeekCompleteListener)设置监听器来处理的。
release()可以释放播放器占用的资源,一旦确定不再使用播放器时应当尽早调用它释放资源。
reset()可以使播放器从Error状态中恢复过来,重新会到Idle状态。
4)设置播放器的监听器:
MediaPlayer提供了一些设置不同监听器的方法来更好地对播放器的工作状态进行监听,以期及时处理各种情况,
如: setOnCompletionListener(MediaPlayer.OnCompletionListener listener)、
setOnErrorListener(MediaPlayer.OnErrorListener listener)等,设置播放器时需要考虑到播放器可能出现的情况设置好监听和处理逻辑,以保持播放器的健壮性。
MediaPlayer类
静态构造方法
方法名称 | 描述 |
public static MediaPlayer create(Context context, Uri uri, SurfaceHolder holder) | 指定从资源ID对应的资源文件中来装载音乐文件,同时指定了SurfaceHolder对象并返回MediaPlyaer对象 |
public static MediaPlayer create(Context context, int resid) | 指定从资源ID对应的资源文件中来装载音乐文件,并返回MediaPlyaer对象 |
public static MediaPlayer create(Context context, Uri uri) | 指定从Uri对应的资源文件中来装载音乐文件,并返回MediaPlyaer对象 |
常用方法
方法名称 | 描述 |
public void start () | 开始或恢复播放 |
public void stop() | 停止播放 |
public void pause() | 暂停播放 |
public void setDataSource (String path) | 从指定的装载path路径所代表的文件 |
public void setDataSource (FileDescriptor fd, long offset, long length) | 指定装载fd所代表的文件中从offset开始、长度为length的文件内容 |
public void setDataSource (FileDescriptor fd) | 指定装载fd所代表的文件 |
public void setDataSource (Context context, Uri uri) | 指定装载uri所代表的文件 |
public void setDataSource (Context context, Uri uri, Map<String, String> headers) | 指定装载uri所代表的文件 |
public void prepare() | 预期准备,因为setDataSource()方法之后,MediaPlayer并未真正的去装载那些音频文件,需要调用prepare()这个方法去准备音频 |
public void setLooping(boolean looping) | 设置是否循环播放这个音乐文件 |
public void setSurface(Surface surface) | 设置Surface |
public void setVolume(float leftVolume,float rightVolume) | 设置音量 |
public void setDisplay(SurfaceHolder sh) | 设置显示方式 |
public void seekTo(int mses) | 寻求指定的时间位置。 |
public void isLooping() | 判断是否循环播放 |
public void isPlaying() | 判断是否正在播放 |
public void release() | 释放相关该MediaPlayer对象的资源。 |
绑定事件监听器
监听器 | 描述 |
public void setOnCompletionListener (MediaPlayer.OnCompletionListener listener) | 为MediaPlayer的播放完成事件绑定事件监听器 |
public void setOnErrorListener (MediaPlayer.OnErrorListener listener) | 为MediaPlayer的播放错误事件绑定事件监听器 |
public void setOnPreparedListener (MediaPlayer.OnPreparedListener listener) | 当MediaPlayer调用prepare()方法时触发该监听器 |
public void setOnSeekCompleteListener (MediaPlayer.OnSeekCompleteListener listener) | 当MediaPlayer调用seek()方法的时候触发该监听器 |
播放音频
1、播放应用的资源文件(res/raw/)
通过我们上面介绍的几个静态构造函数创建MediaPlayer对象
- MediaPlayer mediaPlayer = MediaPlayer.create(MediaPlayerDemoActivity.this,
- R.raw.a1);
2、播放应用的原始资源文件(assets)
1) 通过Context.getAssets()方法获得AssetManager对象
2) 通过AssetManager对象的openFd(String name)方法打开指定的原生资源文件夹,返回一个AssetFileDescriptor对象
3) 通过AssetFileDescriptor的getFileDescriptor()得到一个FileDescriptor对象
4) 通过public void setDataSource (FileDescriptor fd, long offset, long length)来创建MediaPlayer对象
5) 调用MediaPlayer.prepare()方法准备音频
6) 调用MediaPlayer的start()、pause()、stop()等方法控制
- AssetFileDescriptor fileDescriptor = assetManager
- .openFd("a2.mp3");
- mediaPlayer = new MediaPlayer();
- mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),
- fileDescriptor.getStartOffset(),
- fileDescriptor.getLength());
- mediaPlayer.prepare();<p> mediaPlayer.start();</p>
3、播放外部存储上的音频资源文件(sdcard)
1) 创建MediaPlayer对象,通过MediaPlayer对象的setDataSource(String path)方法装载预定的音频文件
2) 调用MediaPlayer对象的prepare()方法准备音频
3) 调用MediaPlayer的start()、pause()、stop()等方法控制
- mediaPlayer = new MediaPlayer();
- mediaPlayer.setDataSource("/mnt/sdcard/a3.mp3");
- mediaPlayer.prepare();
- mediaPlayer.start();
4、播放网络上的音频文件
1) 根据网络上的地址创建Uri对象
2) 通过public void setDataSource (Context context, Uri uri)设置音频来源装载音频文件
3) 调用MediaPlayer对象的prepare()方法准备音频
4) 调用MediaPlayer的start()、pause()、stop()等方法控制
- mediaPlayer = new MediaPlayer();
- // 通过Uri解析一个网络地址
- Uri uri = Uri
- .parse("http://zhangmenshiting2.baidu.com/data2/music/9138619/9138619.mp3?xcode=dd0d0d0df7218eb9a79c7fd72cefb648&mid=0.18926789458694");
- mediaPlayer.setDataSource(MediaPlayerDemoActivity.this, uri);
- mediaPlayer.prepare();
- mediaPlayer.start();
当然也可以通过我们的另一种静态构造方法直接创建一个MediaPlayer对象
- Uri uri = Uri
- .parse("http://zhangmenshiting2.baidu.com/data2/music/9138619/9138619.mp3?xcode=dd0d0d0df7218eb9a79c7fd72cefb648&mid=0.18926789458694");
- mediaPlayer = MediaPlayer.create(MediaPlayerDemoActivity.this,
- uri);
- mediaPlayer.start();
实现效果:
贴上源代码:
- package com.jiahui.media;
- import java.io.IOException;
- public class MediaPlayerDemoActivity extends Activity implements
- OnClickListener {
- private Button btnAppStart, btnAssetsStart, btnSdcardStart,
- btnNetworkStart;
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- btnAppStart = (Button) this.findViewById(R.id.btnAppStart);
- btnAssetsStart = (Button) this.findViewById(R.id.btnAssetsStart);
- btnSdcardStart = (Button) this.findViewById(R.id.btnSdcardStart);
- btnNetworkStart = (Button) this.findViewById(R.id.btnNetworkStart);
- btnAppStart.setOnClickListener(this);
- btnAssetsStart.setOnClickListener(this);
- btnSdcardStart.setOnClickListener(this);
- btnNetworkStart.setOnClickListener(this);
- }
- @Override
- public void onClick(View v) {
- MediaPlayer mediaPlayer = null;
- switch (v.getId()) {
- case R.id.btnAppStart:
- System.out.println("---播放应用的资源文件----");
- // 使用raw下的资源文件创建MediaPlayer对象
- mediaPlayer = MediaPlayer.create(MediaPlayerDemoActivity.this,
- R.raw.a1);
- mediaPlayer.start();
- break;
- case R.id.btnAssetsStart:
- System.out.println("---播放assest的资源文件----");
- AssetManager assetManager = this.getAssets();
- try {
- AssetFileDescriptor fileDescriptor = assetManager
- .openFd("a2.mp3");
- mediaPlayer = new MediaPlayer();
- mediaPlayer.setDataSource(fileDescriptor.getFileDescriptor(),
- fileDescriptor.getStartOffset(),
- fileDescriptor.getLength());
- mediaPlayer.prepare();
- mediaPlayer.start();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- break;
- case R.id.btnSdcardStart:
- System.out.println("---播放SDcard上的文件---");
- try {
- mediaPlayer = new MediaPlayer();
- mediaPlayer.setDataSource("/mnt/sdcard/a3.mp3");
- mediaPlayer.prepare();
- mediaPlayer.start();
- } catch (Exception e) {
- }
- break;
- case R.id.btnNetworkStart:
- System.out.println("播放网络上的音频");
- // http://zhangmenshiting2.baidu.com/data2/music/9138619/9138619.mp3?
- // xcode=dd0d0d0df7218eb9a79c7fd72cefb648&mid=0.18926789458694
- try {
- // mediaPlayer = new MediaPlayer();
- // 通过Uri解析一个网络地址
- Uri uri = Uri
- .parse("http://zhangmenshiting2.baidu.com/data2/music/9138619/9138619.mp3?xcode=dd0d0d0df7218eb9a79c7fd72cefb648&mid=0.18926789458694");
- mediaPlayer.setDataSource(MediaPlayerDemoActivity.this, uri);
- // mediaPlayer.prepare();
- // 也可以直接通过这种方式装载网络上的音频文件
- mediaPlayer = MediaPlayer.create(MediaPlayerDemoActivity.this,
- uri);
- mediaPlayer.start();
- } catch (Exception e) {
- // TODO: handle exception
- }
- break;
- default:
- break;
- }
- }
- }