前言
Android SDK 提供了3套音频播放的API,分别是:MediaPlayer,SoundPool,AudioTrack,本文重点说下MediaPlayer。
Android 多媒体框架支持播放各种常见媒体类型,以便您轻松地将音频、视频和图片集成到应用中。

一、MediaPlayer使用方式
可以使用 MediaPlayer API,播放存储在应用资源(原始资源)内的媒体文件、文件系统中的独立文件或者通过网络连接获得的数据流中的音频或视频。
MediaPlayer对象能够获取、解码以及播放音频和视频,它支持多种不同的媒体源。
1、MediaPlayer加载音频的方式
1.1、静态方式
MediaPlayer提供的静态方式加载音频文件如下
1.1.1、第一种方法:
参数resid一般是我们在资源文件夹res/raw(该文件夹需要自己创建)存放的媒体文件id
public static MediaPlayer create(Context context, int resid);
下面代码是如何播放作为本地原始资源(保存在应用的 res/raw/ 目录中)提供的音频
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.sound_file_1);
mediaPlayer.start(); // no need to call prepare(); create() does that for you
1.1.2、第二种方法:
参数Uri,常用的有使用Uri指向网络资源,也可指向本地文件。
public static MediaPlayer create(Context context, Uri uri);
1.2、 动态方式
1.2.1、setDataSource (String path)
通过 HTTP 流式传输并播放远程网址上的内容或者本地SD卡音频文件地址播放
// Sets the data source (file-path or http/rtsp URL) to use.
//String url = "http://........"; //从网路加载音乐
String url = "../music/samsara.mp3"; //从sd卡中加载音乐
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(url);
mediaPlayer.prepare(); // might take long! (for buffering, etc)
mediaPlayer.start();
1.2.2、setDataSource(AssetFileDescriptor afd) & setDataSource (FileDescriptor fd, long offset, long length)
播放assets目录下的音频文件
「setDataSource(AssetFileDescriptor afd)」
//将音频资源文件放在assets文件夹
AssetFileDescriptor fd = getAssets().openFd("music.mp3");
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaPlayer.prepare() ;
注意:setDataSource(AssetFileDescriptor afd)针对API版本有要求,SDK版本必须是24以上才可以用
所以播放assets目录下的音频文件建议使用下面的方法
「setDataSource (FileDescriptor fd, long offset, long length)」
//需将资源文件放在assets文件夹
AssetFileDescriptor fd = getAssets().openFd("music.mp3");
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(fd, fd.getStartOffset(), fd.getLegth())
mediaPlayer.prepare() ;
1.2.3、setDataSource (Context context, Uri uri)
此方法一般通过ContentProvider获取Android系统提供 的共享music获取uri,然后设置数据播放
Uri myUri = ....; // initialize Uri here
MediaPlayer mediaPlayer = new MediaPlayer();
mediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mediaPlayer.setDataSource(getApplicationContext(), myUri);
mediaPlayer.prepare();
mediaPlayer.start();
总结:
1、静态方式加载简单,但每一次调用都会创建一个MediaPlayer对象,适合一次性播放的任务场景。
2、当使用MediaPlayer进行循环播放的时候,不适合使用静态方式了,可以使用动态加载的方式,使用一个MediaPlayer对象去循环加载资源文件。
3、需要注意的是使用动态加载之后一定要调用prepare()方法去预装文件
二、MediaPlayer音频播放封装
1、MediaPlayer的控制方法
MediaPlayer有三个主要的方法进行播放控制
start():开始或者恢复播放
stop():停止播放
pause():暂停播放
2、MediaPlayer音频播放封装
2.1、MediaPlayer的播放控制
创建MediaManager,类管理MediaPlayer添加播放控制方法 参数:需要播放音频的地址 & 听播放完成的监听
public class MediaManager {
public static MediaPlayer mMediaPlayer;
private static boolean isPause;
public void playSound(String filePath,