`

Android4开发入门经典 之 第十部分:多媒体

 
阅读更多

简介

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代码:
  1. Uri myUri = ....; //访问其他的Content,基本上都是通过URI  
  2. MediaPlayer mediaPlayer = new MediaPlayer();  
  3. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  4. mediaPlayer.setDataSource(getApplicationContext(), myUri);  
  5. mediaPlayer.prepare();  
  6. mediaPlayer.start();  

MediaPlayer访问远程多媒体资源,多是通过流式来处理,示例代码如下:


java代码:
  1. String url = "http://........";  
  2. MediaPlayer mediaPlayer = new MediaPlayer();  
  3. mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  4. mediaPlayer.setDataSource(url);  
  5. mediaPlayer.prepare();  
  6. mediaPlayer.start();  

释放MediaPlayer,示例代码如下:


java代码:
  1. mediaPlayer.release();  
  2. mediaPlayer = null;  
  3.    
如果要播放视频,方式也差不多,只不过需要添加用来显示视频的Widget,常用的是SurfaceView,它的功能较强,可以实现很多定制功能。当然也可以使用VideoView,它使用简单,但定制功能不强。

这里有一个简单的播放视频的示例,布局文件的示例代码如下:


java代码:
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="fill_parent"  
  3.     android:layout_height="fill_parent"  
  4.     android:orientation="vertical" >  
  5.     <SurfaceView  
  6.         android:id="@+id/surface"  
  7.         android:layout_width="fill_parent"  
  8.         android:layout_height="200dp"      />  
  9.     <Button  
  10.         android:id="@+id/start"  
  11.         android:layout_width="wrap_content"  
  12.         android:layout_height="wrap_content"  
  13.         android:text="播放"       />  
  14.     <Button  
  15.         android:id="@+id/stop"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:text="停止"       />  
  19. </LinearLayout>  

程序里面的示例代码如下:


java代码:
  1. public class MtActivity extends Activity {  
  2.     private MediaPlayer mMediaPlayer;  
  3.     private SurfaceView mPreview;  
  4.     private SurfaceHolder holder;  
  5.     public void onCreate(Bundle savedInstanceState) {  
  6.         super.onCreate(savedInstanceState);  
  7.         setContentView(R.layout.main);  
  8.          
  9.         mPreview = (SurfaceView) findViewById(R.id.surface);  
  10.         holder = mPreview.getHolder();  
  11.         holder.setFixedSize(100,100);  
  12.         holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);        
  13.          
  14.         Button start = (Button)this.findViewById(R.id.start);  
  15.         Button stop = (Button)this.findViewById(R.id.stop);  

java代码:
  1. start.setOnClickListener(new OnClickListener(){  
  2. @Override  
  3. public void onClick(View v) {  
  4. mMediaPlayer = MediaPlayer.create(MtActivity.this, R.raw.t1);  
  5.             mMediaPlayer.setDisplay(holder);  
  6. //            mMediaPlayer.prepare();  
  7.           mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);  
  8.                      mMediaPlayer.start();  
  9. }  
  10.         });  
  11.         stop.setOnClickListener(new OnClickListener(){  
  12. @Override  
  13. public void onClick(View v) {  
  14. mMediaPlayer.stop();  
  15. }  
  16.         });  
  17.     }     
  18. }  
  19. 视频文件,尽量选用3gp或mp4的格式  
  20.    

异步preparation

使用MediaPlayer,在调用prepare()方法的时候,该方法可能会执行较长的时间,比如它需要对媒体文件进行解码,这意味着它不应该运行在UI Thread里面,否则会阻塞UI线程。
解决方案是:使用另外的线程来准备媒体资源,准备好后通知主线程。
这个模式在Android的多媒体框架里面已经得到支持,你可以调用prepareAsync()方法,这个方法会在后台进行资源的准备,并在准备好后通知监听器:MediaPlayer.OnPreparedListener,然后执行onPrepared()方法即可。

在Service里面异步使用MediaPlayer

使用MdeiaPlayer来播放音乐,通常都是在Service中使用,为了不阻塞UI线程,通常会异步的使用,示例代码如下:

java代码:
  1. public class MyService extends Service implements MediaPlayer.OnPreparedListener {  
  2.     MediaPlayer mMediaPlayer = null;  
  3.     public int onStartCommand(Intent intent, int flags, int startId) {  
  4.         mMediaPlayer = new MediaPlayer();  
  5.         mMediaPlayer.setDataSource(getApplicationContext(), myUri);  
  6.         mMediaPlayer.setOnPreparedListener(this);  
  7.         mMediaPlayer.prepareAsync();  
  8.     }  
  9.     public void onPrepared(MediaPlayer player) {  
  10.         player.start();  
  11.     }  
  12. }  

处理异步使用MediaPlayer的错误

异步使用MdeiaPlayer的时候,对于可能出现的错误,可以通过实现MediaPlayer.OnErrorListener,来监听并处理,示例代码如下:

java代码:
  1. public class MyService extends Service implements MediaPlayer.OnPreparedListener , MediaPlayer.OnErrorListener {  
  2.     MediaPlayer mMediaPlayer = null;  
  3.     public int onStartCommand(Intent intent, int flags, int startId) {  
  4.         //………  
  5. mMediaPlayer.setOnErrorListener(this);  
  6.     }  
  7.     public void onPrepared(MediaPlayer player) {  
  8.         player.start();  
  9.     }  
  10.     public boolean onError(MediaPlayer mp, int what, int extra) {  
  11. //在这里处理错误  
  12.     }  
  13. }  

使用wake lock

当使用MdeiaPlayer在后台播放音乐的时候,用户可能会关闭或锁定手机,以节约电量,此时所有的应用都会强制sleep。
为了当手机重新开启或解除锁定的时候,播放音乐的后台服务能继续运行,你需要设置wake lock的模式。
基本的设置方式很简单,就一句话,示例代码如下:

java代码:
  1. mMediaPlayer.setWakeMode(getApplicationContext(), PowerManager.PARTIAL_WAKE_LOCK);  
还需要添加权限如下:

java代码:
  1. <uses-permission android:name="android.permission.WAKE_LOCK"/>  
  2.    
但要注意一定,如果你的service还需要其他服务的支持,比如需要通过蓝牙去获取数据,那么,在wake你的service的时候,还需要wake这些相应的服务。
 

在foreground Service中使用MediaPlayer

使用MdeiaPlayer来播放音乐,也经常需要在前端界面上,同步显示一些信息,比如:歌曲名称等,这就需要实现foreground service,示例代码如下:

java代码:
  1. String songName;  
  2. PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0,  
  3.                 new Intent(getApplicationContext(), MainActivity.class),  
  4.                 PendingIntent.FLAG_UPDATE_CURRENT);  
  5.    
  6. Notification notification = new Notification();  
  7. notification.tickerText = text;  
  8. notification.icon = R.drawable.play0;  
  9. notification.flags |= Notification.FLAG_ONGOING_EVENT;  
  10.    
  11. notification.setLatestEventInfo(getApplicationContext(), "MusicPlayerSample","Playing: " + songName, pi);  
  12.    
  13. startForeground(NOTIFICATION_ID, notification);  


视频配套PPT,视频地址【Android4开发入门经典独家视频课程

8
7
分享到:
评论

相关推荐

    Android开发入门经典

    “第十部分 多媒体”部分将介绍Android的多媒体框架,学习如何使用MediaPlayer对象来播放音乐和视频,结合SurfaceView来播放视频,异步准备多媒体资源,以及处理错误和使用wakelock。 “第十一部分 网络编程”涉及...

    Android 4游戏编程入门经典

    《Android 4游戏编程入门经典》这本书是为那些希望在Android平台上开发游戏的新手准备的全面指南。本书覆盖了从Android基础知识到游戏开发高级技巧的所有内容,并通过实际案例帮助读者掌握所需技能。 #### 二、章节...

    Android App开发入门范例程序

    在Android App开发领域,入门是每个开发者必经的阶段。这个"Android App开发入门范例程序"集合提供了多个章节的学习材料,旨在帮助新手快速掌握Android应用的基础开发技能。以下是各个章节和FlagAPI部分可能涉及的...

    Android开发入门经典资料下载

    《Android开发入门经典》这本书是Android开发者初学者的宝贵资源,它涵盖了Android应用开发的基础知识,从环境搭建到实际项目开发,全方位地引导新手进入Android世界。以下将详细阐述书中的核心知识点: 1. **...

    Android 移动开发入门与进阶 源代码

    "Android 移动开发入门与进阶 源代码"是一个宝贵的资源,它涵盖了从基础到高级的Android应用开发知识。由张立国编著的这本书,通过源代码的形式,帮助读者深入理解Android应用的构建过程。 本书分为多个章节,从"ch...

    android开发从入门到精通随书源码7-12章.zip

    《Android开发从入门到精通》是一本广受欢迎的Android编程指南,涵盖了从基础到进阶的各个层面。随书源码7-12章的压缩包包含的是书中第七至第十二章的实例代码,旨在帮助读者更好地理解和实践所学知识。下面我们将...

    Android.游戏开发入门

    在《Android游戏开发入门》这本书中,作者Mario Zechner将引导读者通过十四章的内容深入理解Android平台上的游戏开发技术。本书不仅适合初学者,也适用于有一定编程基础但希望在Android平台上进行游戏开发的程序员。...

    android开发入门与实战

    《Android开发入门与实战》是一本面向初学者的Android应用开发指南,旨在帮助读者快速掌握Android编程的基础知识和实战技能。这本书通常会涵盖以下几个核心知识点: 1. **Android开发环境搭建**:首先,你需要了解...

    《Android开发从入门到精通》练习项目源代码

    《Android开发从入门到精通》是一本针对初学者和进阶者的学习指南,旨在帮助读者掌握Android应用开发的核心技能。本书的练习项目源代码提供了丰富的实践案例,涵盖了Android开发的多个重要方面,如用户界面设计、...

    [Android开发从入门到精通].扶松柏光盘源代码.rar

    4. **第10章:多媒体开发** - 播放音频和视频:MediaPlayer和VideoView组件的使用。 - 捕获媒体:Camera API和MediaRecorder进行拍照和录制视频。 - 图像处理:Bitmap和Canvas操作,以及使用 Glide 或 Picasso ...

    Android开发从入门到精通(随书光盘)【源码】第14章

    在本资源中,我们聚焦于"Android开发从入门到精通(随书光盘)【源码】第14章",这显然是一份专为学习Android应用开发设计的教学材料。第14章通常涵盖特定的主题或技能,可能是进阶概念,也可能是对前面章节的深入...

    [14本经典Android开发教程]-3-Android SDK 中文开发文档

    [14本经典Android开发教程]-3-Android SDK 中文开发文档 什么是 Android? Android 是一个专门针对移动设备的软件集,它包括一个操作系统,中间件和一些重要的应用程序。Beta版的 Android SDK 提供了在Android 平台上...

    Android开发入门介绍

    ### Android开发入门介绍 在移动互联网时代,Android作为全球最大的移动操作系统之一,其应用开发的重要性不言而喻。本文将围绕“Android开发入门介绍”这一主题展开,旨在为初学者提供一个全面的基础知识体系,...

    android 开发入门教程 从配置环境开始

    Android开发入门教程从配置环境开始,是一套针对初学者精心设计的教程,旨在帮助零基础的学员快速掌握Android应用开发的基础知识。本教程分为十二个章节,内容涵盖全面,逐步引导学习者进入Android开发的世界。 第...

    [Android开发从入门到精通].扶松柏.扫描版 pdf

    根据提供的文件信息,我们可以推断出这是一本关于Android开发的书籍——《Android开发从入门到精通》,作者为扶松柏。尽管具体内容链接无法直接访问,但基于标题、描述及部分可见信息,我们可以总结出一些重要的知识...

    Android App设计开发 PPT

    8. **第10章:定位与地图服务** - GPS与网络定位 - Google Maps API的使用 - 地图上的标记与路径绘制 9. **第11章:权限管理与安全** - Android 6.0以上的运行时权限管理 - 数据加密与安全编码实践 - 应用...

    Android移动应用开发从入门到精通附书源码examples样例

    10. **Android Studio IDE**:作为Android开发的主要工具,Android Studio的使用技巧和调试方法也是学习的一部分。 通过这些例子,你可以逐步了解并掌握Android开发的全过程,从创建项目、编写代码、运行调试,到...

Global site tag (gtag.js) - Google Analytics