简介
Android的多媒体框架,在2.3之前是采用的Open Core,在2.3之后采用的是Stagefright。不管框架的内部实现如何变化,对外提供的API都是一样的。
Android的多媒体框架提供了对大多数主流多媒体格式的支持,使得我们能够很方便的进行音频、视频和图片的操作。最主要的就是使用MediaPlayer接口。
MediaPlayer接口的常见功能
1:create :创建一个MediaPlayer对象
2:setDataSource :设置要播放的资源
3:start() :开始播放
4:pause() :暂停播放
5:prepare() :准备要播放的内容,同步的
6:release() :释放播放器对象
7:reset() :重置播放的资源
8:seekTo(int site) :跳转到开始播放的位置
9:stop() :停止播放
使用MediaPlayer
MediaPlayer既能播放音频,也能播放视频,是我们要主要学习的内容。它能支持如下的多媒体资源:
1:Local资源
2:内部的URI,比如从其他的ContentProvider中获取的媒体资源
3:外部的URI,可能是通过流式获取的媒体资源
MediaPlayer访问本地多媒体资源
所谓本地资源,多是放置在res/raw/下面的多媒体文件。示例代码如下:
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start();
不需要调用prepare()了,create()方法已经帮我们完成这个功能了
MediaPlayer访问内部的URI
这通常都是从其他的内容提供者那里去获取,一般都采用流来处理,示例代码如下:
java代码:
Uri myUri = ....; //访问其他的Content,基本上都是通过URI
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
MediaPlayer访问远程多媒体资源,多是通过流式来处理,示例代码如下:
java代码:
String url = "http://........";
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();
mediaPlayer.start();
释放MediaPlayer,示例代码如下:
java代码:
mediaPlayer.release();
mediaPlayer = null;
如果要播放视频,方式也差不多,只不过需要添加用来显示视频的Widget,常用的是SurfaceView,它的功能较强,可以实现很多定制功能。当然也可以使用VideoView,它使用简单,但定制功能不强。
这里有一个简单的播放视频的示例,布局文件的示例代码如下:
java代码:
程序里面的示例代码如下:
java代码:
public class MtActivity extends Activity {
private MediaPlayer mMediaPlayer;
private SurfaceView mPreview;
private SurfaceHolder holder;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.setFixedSize(100,100);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
Button start = (Button)this.findViewById(R.id.start);
Button stop = (Button)this.findViewById(R.id.stop);
java代码:
start.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mMediaPlayer = MediaPlayer.create(MtActivity.this, R.raw.t1);
mMediaPlayer.setDisplay(holder);
// mMediaPlayer.prepare();
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.start();
}
});
stop.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
mMediaPlayer.stop();
}
});
}
}
视频文件,尽量选用3gp或mp4的格式
异步preparation
使用MediaPlayer,在调用prepare()方法的时候,该方法可能会执行较长的时间,比如它需要对媒体文件进行解码,这意味着它不应该运行在UI Thread里面,否则会阻塞UI线程。
解决方案是:使用另外的线程来准备媒体资源,准备好后通知主线程。
这个模式在Android的多媒体框架里面已经得到支持,你可以调用prepareAsync()方法,这个方法会在后台进行资源的准备,并在准备好后通知监听器:MediaPlayer.OnPreparedListener,然后执行onPrepared()方法即可。
在Service里面异步使用MediaPlayer
使用MdeiaPlayer来播放音乐,通常都是在Service中使用,为了不阻塞UI线程,通常会异步的使用,示例代码如下:
java代码:
public class MyService extends Service implements MediaPlayer.OnPreparedListener {
MediaPlayer mMediaPlayer = null;
public int onStartCommand(Intent intent, int flags, int startId) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(getApplicationContext(), myUri);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.prepareAsync();
}
public void onPrepared(MediaPlayer player) {
player.start();
}
}
处理异步使用MediaPlayer的错误
异步使用MdeiaPlayer的时候,对于可能出现的错误,可以通过实现MediaPlayer.OnErrorListener,来监听并处理,示例代码如下:
java代码:
public class MyService extends Service implements MediaPlayer.OnPreparedListener , MediaPlayer.OnErrorListener {
MediaPlayer mMediaPlayer = null;
public int onStartCommand(Intent intent, int flags, int startId) {
//………
mMediaPlayer.setOnErrorListener(this);
}
public void onPrepared(MediaPlayer player) {
player.start();
}
public boolean onError(MediaPlayer mp, int what, int extra) {
//在这里处理错误
}
}
使用wake lock
当使用MdeiaPlayer在后台播放音乐的时候,用户可能会关闭或锁定手机,以节约电量,此时所有的应用都会强制sleep。
为了当手机重新开启或解除锁定的时候,播放音乐的后台服务能继续运行,你需要设置wake lock的模式。
基本的设置方式很简单,就一句话,示例代码如下:
java代码:
mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);
还需要添加权限如下:
java代码:
但要注意一定,如果你的service还需要其他服务的支持,比如需要通过蓝牙去获取数据,那么,在wake你的service的时候,还需要wake这些相应的服务。
在foreground Service中使用MediaPlayer
使用MdeiaPlayer来播放音乐,也经常需要在前端界面上,同步显示一些信息,比如:歌曲名称等,这就需要实现foreground service,示例代码如下:
java代码:
String songName;
PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0,
new Intent(getApplicationContext(), MainActivity.class),
PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new Notification();
notification.tickerText = text;
notification.icon = R.drawable.play0;
notification.flags |= Notification.FLAG_ONGOING_EVENT;
notification.setLatestEventInfo(getApplicationContext(), "MusicPlayerSample","Playing: " + songName, pi);
startForeground(NOTIFICATION_ID, notification);
视频配套PPT,视频地址【Android4开发入门经典独家视频课程】
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26715458/viewspace-717434/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26715458/viewspace-717434/