android播放音频文件(MediaPlayer)和录音(MediaRecorder)--播放音频文件

时间:2022-09-05 03:54:22

接上一篇  android播放音频文件(MediaPlayer)和录音(MediaRecorder)--录音,接着开始讲播放网络音频文件的功能。

二、播放音频文件

传递网络音频的URL播放音频文件。

manager.player("http://5.26923.com/download/ring/000/100/96163302708ec2cf1f9d67c846aac59e.amr");

接下来,根据传递的URL,判断需要播放的网络音频是否已经缓存到本地,如果已经缓存到本地,则播放本地缓存的音频文件,如果没有缓存到本地则播放网络音频文件并且同时下载网络音频文件缓存到本地。

/**
* 播放音频文件
* @param url 音频文件url地址
*/
public void player(String url) {
// 如果当前正在播放,则直接返回
if(player.isPlaying()){
Log.i("MediaManager", "MediaPlayer is playing……");
return;
}
try {
String path = fileUtils.exists(url); // 判断是否存在缓存文件
if(path != null) { // 存在缓存文件
// 直接播放缓存文件
player.setDataSource(path); // 设置数据源
player.prepare(); // 准备(File), 同步
player.start(); // 播放音频文件
}else { // 不存在音频缓存文件,则边存边播
// 异步下载音频文件
new AudioAsyncTask().execute(url);
player.setDataSource(url); // 设置数据源为网络文件
player.prepareAsync(); // 准备(InputStream), 异步
player.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
// 准备完成后, 开始播放音频文件
mp.start();
}
});
}
} catch (IOException e) {
e.printStackTrace();
}
}
使用异步下载音频文件到本地

/**
* 异步下载音频文件
*/
private class AudioAsyncTask extends AsyncTask<String, Void, Void> {

@Override
protected Void doInBackground(String... params) {
try {
URL url = new URL(params[0]); // 构建URL
// 构造网络连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 保存音频文件
fileUtils.saveFile(conn.getInputStream());
conn.disconnect(); // 断开网络连接
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
使用异步下载音频文件到本地

/**
* 异步下载音频文件
*/
private class AudioAsyncTask extends AsyncTask<String, Void, Void> {

@Override
protected Void doInBackground(String... params) {
try {
URL url = new URL(params[0]); // 构建URL
// 构造网络连接
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 保存音频文件
fileUtils.saveFile(conn.getInputStream());
conn.disconnect(); // 断开网络连接
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}

到此,播放网络音频文件和录音的功能就实现完成了,由于网络上有很多关于MediaPlayer和MediaRecorder的讲解,并且代码里的注释也比较详细,所以这两篇博客我的讲解都比较少,大部分都是代码片段,同时下面也会附上 源码的下载地址。


源代码