Android4开发入门经典 之 第十部分:多媒体
16lz
2021-01-26
简介
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代码: 查看 复制到剪贴板 打印
- UrimyUri=....;//访问其他的Content,基本上都是通过URI
- MediaPlayermediaPlayer=newMediaPlayer();
- mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mediaPlayer.setDataSource(getApplicationContext(),myUri);
- mediaPlayer.prepare();
- mediaPlayer.start();
MediaPlayer访问远程多媒体资源,多是通过流式来处理,示例代码如下:
java代码: 查看 复制到剪贴板 打印
- Stringurl="http://........";
- MediaPlayermediaPlayer=newMediaPlayer();
- mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mediaPlayer.setDataSource(url);
- mediaPlayer.prepare();
- mediaPlayer.start();
释放MediaPlayer,示例代码如下:
java代码: 查看 复制到剪贴板 打印
- mediaPlayer.release();
- mediaPlayer=null;
这里有一个简单的播放视频的示例,布局文件的示例代码如下:
java代码: 查看 复制到剪贴板 打印
- <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- android:orientation="vertical">
- <SurfaceView
- android:id="@+id/surface"
- android:layout_width="fill_parent"
- android:layout_height="200dp"/>
- <Button
- android:id="@+id/start"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="播放"/>
- <Button
- android:id="@+id/stop"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="停止"/>
- </LinearLayout>
程序里面的示例代码如下:
java代码: 查看 复制到剪贴板 打印
- publicclassMtActivityextendsActivity{
- privateMediaPlayermMediaPlayer;
- privateSurfaceViewmPreview;
- privateSurfaceHolderholder;
- publicvoidonCreate(BundlesavedInstanceState){
- 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);
- Buttonstart=(Button)this.findViewById(R.id.start);
- Buttonstop=(Button)this.findViewById(R.id.stop);
java代码: 查看 复制到剪贴板 打印
- start.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- mMediaPlayer=MediaPlayer.create(MtActivity.this,R.raw.t1);
- mMediaPlayer.setDisplay(holder);
- //mMediaPlayer.prepare();
- mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
- mMediaPlayer.start();
- }
- });
- stop.setOnClickListener(newOnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- mMediaPlayer.stop();
- }
- });
- }
- }
- 视频文件,尽量选用3gp或mp4的格式
异步preparation
使用MediaPlayer,在调用prepare()方法的时候,该方法可能会执行较长的时间,比如它需要对媒体文件进行解码,这意味着它不应该运行在UI Thread里面,否则会阻塞UI线程。 解决方案是:使用另外的线程来准备媒体资源,准备好后通知主线程。 这个模式在Android的多媒体框架里面已经得到支持,你可以调用prepareAsync()方法,这个方法会在后台进行资源的准备,并在准备好后通知监听器:MediaPlayer.OnPreparedListener,然后执行onPrepared()方法即可。在Service里面异步使用MediaPlayer
使用MdeiaPlayer来播放音乐,通常都是在Service中使用,为了不阻塞UI线程,通常会异步的使用,示例代码如下:java代码: 查看 复制到剪贴板 打印
- publicclassMyServiceextendsServiceimplementsMediaPlayer.OnPreparedListener{
- MediaPlayermMediaPlayer=null;
- publicintonStartCommand(Intentintent,intflags,intstartId){
- mMediaPlayer=newMediaPlayer();
- mMediaPlayer.setDataSource(getApplicationContext(),myUri);
- mMediaPlayer.setOnPreparedListener(this);
- mMediaPlayer.prepareAsync();
- }
- publicvoidonPrepared(MediaPlayerplayer){
- player.start();
- }
- }
处理异步使用MediaPlayer的错误
异步使用MdeiaPlayer的时候,对于可能出现的错误,可以通过实现MediaPlayer.OnErrorListener,来监听并处理,示例代码如下:java代码: 查看 复制到剪贴板 打印
- publicclassMyServiceextendsServiceimplementsMediaPlayer.OnPreparedListener,MediaPlayer.OnErrorListener{
- MediaPlayermMediaPlayer=null;
- publicintonStartCommand(Intentintent,intflags,intstartId){
- //………
- mMediaPlayer.setOnErrorListener(this);
- }
- publicvoidonPrepared(MediaPlayerplayer){
- player.start();
- }
- publicbooleanonError(MediaPlayermp,intwhat,intextra){
- //在这里处理错误
- }
- }
使用wake lock
当使用MdeiaPlayer在后台播放音乐的时候,用户可能会关闭或锁定手机,以节约电量,此时所有的应用都会强制sleep。 为了当手机重新开启或解除锁定的时候,播放音乐的后台服务能继续运行,你需要设置wake lock的模式。 基本的设置方式很简单,就一句话,示例代码如下:java代码: 查看 复制到剪贴板 打印
- mMediaPlayer.setWakeMode(getApplicationContext(),PowerManager.PARTIAL_WAKE_LOCK);
java代码: 查看 复制到剪贴板 打印
- <uses-permissionandroid:name="android.permission.WAKE_LOCK"/>
在foreground Service中使用MediaPlayer
使用MdeiaPlayer来播放音乐,也经常需要在前端界面上,同步显示一些信息,比如:歌曲名称等,这就需要实现foreground service,示例代码如下:java代码: 查看 复制到剪贴板 打印
- StringsongName;
- PendingIntentpi=PendingIntent.getActivity(getApplicationContext(),0,
- newIntent(getApplicationContext(),MainActivity.class),
- PendingIntent.FLAG_UPDATE_CURRENT);
- Notificationnotification=newNotification();
- 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开发入门经典独家视频课程】
原创内容 转自请注明【 http://sishuok.com/forum/blogPost/list/0/2750.html#7734】更多相关文章
- android 数据备份
- AndroidStudio使用NDK编译C/C++代码使用原生库
- Android开发之:Toast和Notification
- Android(安卓)开发环境搭建 与在编译中遇到错误make Error 45解
- Qt for Android(安卓)- JNI
- 下载并编译CyanogenMod源代码
- android异常捕获,异常拦截,仿奔溃
- Android(安卓)学习之《第一行代码》第二版 笔记(二十)播放多媒体文
- android之填写文本自动补充AutoCompleteTextView和MultiAutoComp