此文参照 android developer API Guides
Media Playback(媒体播放)
Android 多媒体框架能够支持多种普通媒体类型,所以我们很容易的整合音频,视频,图片到我们的应用中来。这些多媒体的资源可以是本地文件系统上的,也可以是网络上的。在android中播放音频视频使用的都是MediaPlayer apis。
这篇文档会向我们展示怎样去写一个媒体播放应用,能使得用户和系统之间有一个比较好的表现和用户的良好体验。
注意:
我们只能通过标准的输出设备来播放在音频数据,当前,指的是使用手机设备的扬声器或者蓝牙耳机。在语音通过过程中,我们不能播放声音文件。
The Basics(基础)
下面的类在Android 框架中被用来播放音视频的。
MediaPlayer:播放声音和视频的主要api。
AudioManager:用于管理音频资源以及音频在设备上的输出。
Manifest中的声明
添加两个权限:
①需要播放网络视频的需要添加INTERNET权限
②屏幕熄屏的时候,我们需要添加WAKE_LOCK权限
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
Using MediaPlayer
媒体框架中的一个重要的组件是MediaPlayer类。MeidaPlayer类的对象通过简单的设置能够获取,解码和播放音视频文件。能够支持多种不同的媒体的资源:
①本地资源
②外部的URIs,比如你可以从ContentResolver中去获取。
③外部的URLs(Streaming),理解成网络上的
MediaPlayer支持的格式:
demo:
播放本地res/raw/目录下的音频:
MediaPlayer mediaPlayer =MediaPlayer.create(context, R.raw.sound_file_1);播放URIs 中的音频:
mediaPlayer.start();// no need to call prepare(); create() does that for you
Uri myUri =....;// initialize Uri here播放远程网络上的音频:
MediaPlayer mediaPlayer =newMediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
String url ="http://........";// your URL here提醒:
MediaPlayer mediaPlayer =newMediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare();// might take long! (for buffering, etc)
mediaPlayer.start();
播放网络上的视频,可能用出现或遇到这两种异常IllegalArgumentException and IOException ,在当你使用setDataSource()方法的时候。因为有可能网络上的视频根本就不存在。
Asynchronous Preparation(异步准备)
因为视频准备过程(包括缓冲区的准备)是一个相对耗时的工作。所以异步的方式去准备视频是有必要的。所以android media框架中也提供了
prepareAsyc()用来做异步视频的准备工作。设置setOnPreparedListener方法,可以在准备完成的时候,回调onPrepared方法。也就标示了视频已经准备完成。可以去调用相应的生命周期的方法,比如start()方法去播放视频。
Managing state
(管理生命周期的状态,这部分内容在基础篇生命周期状态图中已经有说明)
google 的api guide 中再次提醒我们在编写media应用的时候,要在脑海中有media 生命周期的状态图。避免编写一些非法状态下的代码。以避免一些没有必要的异常的出现。
Releasing the MediaPlayer(释放mediaPlayer组件)
MediaPlayer能消耗Android系统比较宝贵的资源。因此我们要特别注意不要在没有必要的情况下,持有MediaPlayer实例很长时间。下面是释放资源的处理方法:
mediaPlayer.release();在音乐播放器这种场景下或一些类似的场景下,即使用户已经离开了当前的activity,但是还需要播放多媒体。这时候,需要在Service中去控制MeidaPlayer。
mediaPlayer =null;
Using a Service with MediaPlayer(使用带有多媒体的服务)
当你希望用户离开使用了MediaPlayer功能的application。或者用户切换到了别的application,但是仍然要保证应用的MediaPlayer的播放等。这就是需要使用Android提供的四大组件之一Service。让Service来控制Mediaplayer。用户和系统对运行后台服务的应用如何同系统其它部分交互有一些期望,如果你的应用无法满足这些期望,用户可能会有糟糕的体验。本节描述了你需要注意的主要事项以及如何解决的建议。
Running asychronously(异步运行)
首先,同Activity一样,默认情况下Service中的所有工作也是在主线程中完成的。因此,服务需要快速的处理传入的intent,在响应意图是不能执行长时间操作。如果有大量的工作或者阻塞式的调用,就需要异步的完成。
举个例子,当你在主线程中使用MediaPlayer,你应该使用prepareAsyc()而不使用prepare(),可以通过实现MediaPlayer.OnPreparedListener这个接口来接受准备完成的回调。这个时候,你可以启用start方法去播放多媒体。
下面是一个在service中执行的例子:
publicclassMyServiceextendsServiceimplementsMediaPlayer.OnPreparedListener{