一、简介
Android的多媒体框架包括支持播放多种常见的媒体类型,使您可以轻松的把音频、视屏和图像集成到您的应用。您可以播放音频或视屏媒体文件,这些文件是存储在你的应用程序的资源文件中的。应用程序的资源文件可以是文件系统中独立的文件,或者通过网络连接获取的一个数据流,所有使用MediaPlayer APIS的资源文件。
注意:您只能在标准输出设备上播放音频数据。目前,标准输出设备是移动设备的扬声器或耳机。您不能在谈话音频调用期间播放声音文件。
1、基础
下面的类是Android框架中用于播放声音的类:
MediaPlayer:这个类主要用于播放声音和视屏
AudioManager:这个类主要管理音频和音频输出设备
2、声明Manifest文件
//网络权限申明
<uses-permission android:name="android.permission.INTERNET" />
如果您的播放应用需要阻止屏幕变暗或者阻止处理器睡眠,或者使用MediaPlayer.setScreenOnWhielePlaying()或MedidaPlayer.setWakeMode()方法,需要加入下面的权限。
//唤醒锁申明
<uses-permission android:name="android.permission.WAKE_LOCK" />
二、使用MediaPlayer
媒体框架中最重要的组件之一就是MediaPlayer类,此类的对象可以用少量的设置即能获取,解码和播放音频视屏,它支持多种媒体源,比如:
- 本地资源
- 内部URI,比如从您的ContentResolver取得的URI
- 外部URI(媒体流)
1、播放本地资源
//播放本地资源文件,create方法中包括了setDataSource和prepare的执行
MediaPlayer _mp = MediaPlayer.create(this, R.raw.millets);
_mp.start();
2、播放一个本地URI
//播放文本文件的资源文件
String _path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + "/millets.mp4";
try {
//也可以采用这种方式创建对象
MediaPlayer _mpFile = new MediaPlayer();
_mpFile.setDataSource(this, Uri.parse(_path));
_mpFile.prepare();//同步执行
_mpFile.start();
} catch (IOException e) {
e.printStackTrace();
}
3、播放网络地址
//播放网络的资源
String _netPath = "http://.mp4";
MediaPlayer _netMp = new MediaPlayer();
try {
_netMp.setDataSource(this, Uri.parse(_netPath));
_netMp.prepareAsync();//异步执行
//需要等待prepareAsync准备结束后,回调通知才可以播放
_netMp.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
mp.start();
}
});
} catch (IOException e) {
e.printStackTrace();
}
4、管理状态
MediaPlayer有一个内部的状态,因为特定的操作只能在特定的状态时才能有效。如果你在错误的状态下执行一个操作,系统可能抛出一个异常或者导致一个意外的行为。
5、释放MediaPlayer
MediaPlayer可能要消耗大量的系统资源。因此您应该总是采用一些额外的措施来确保在一个MediaPlayer实例上不会挂起太长的时间。当您用玩MediaPlayer时,您应该总是调用release()来保证任何分配给MeidaPlayer的系统资源被正确的释放。
mediaPlayer.release();
mediaPlayer = null;
6、完整例子:
public class MediaMainActivity extends BaseActivity implements View.OnClickListener, MediaPlayer.OnPreparedListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnErrorListener {
//UI
private android.widget.Button buttonpre;
private android.widget.Button buttonstart;
private android.widget.Button buttonpause;
private android.widget.Button buttonnext;
private MediaPlayer mMediaPlayer;
//data
private ArrayList<String> mMusicList;
private int mMusicIndex = 0;
private boolean isPaused = false;
@Override
public void initData(Bundle savedInstanceState) {
//init music data
String _musicPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MUSIC).getPath();
String _a = _musicPath + File.separator + "mbc.mp3";
String _b = _musicPath + File.separator + "rgyzd.mp3";
String _c = _musicPath + File.separator + "rga.mp3";
String _d = _musicPath + File.separator + "zxk.mp3";
String _e = _musicPath + File.separator + "aj.mp3";
mMusicList = new ArrayList<>();
mMusicList.add(_a);
mMusicList.add(_b);
mMusicList.add(_c);
mMusicList.add(_d);
mMusicList.add(_e);
//init media
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnErrorListener(this);
}
@Override
public void initView(Bundle savedInstanceState) {
setContentView(R.layout.activity_media_main);
this.buttonnext = (Button) findViewById(R.id.button_next);
this.buttonnext.setOnClickListener(this);
this.buttonpause = (Button) findViewById(R.id.button_pause);