业务背景:谈业务背景之前,想说的是,出身java开发的我竟然转生到Android异世界当勇者,因为害怕加班,而点满了各种网上get的技能点~
可以说是在一阵疯狂查阅后,终于是解决了第一个问题,assets下的音频播放,接着由浅入深,向后是实现播放手机内存上的音频…
一、直接上封装方法
/**
* 在线播放音乐
*/
void playOnlineSound(String soundUrlDict) {
try {
Log.i(TAG,"playOnlineSound:"+soundUrlDict);
MediaPlayer mediaPlayer = new MediaPlayer();
if(!TextUtils.isEmpty(soundUrlDict) && !soundUrlDict.contains("/")){
//如果不包含"/" 则调用assets内的音频 例xxx.mp3
//获取assets目录下音频文件的AssetFileDescriptor
AssetFileDescriptor afd = getAssets().openFd(soundUrlDict);
//获取AssetFileDescriptor中的 音频文件 / 起始偏移量 / 文件长度:
mediaPlayer.setDataSource(afd.getFileDescriptor(), afd.getStartOffset(), afd.getLength());
}else if(!TextUtils.isEmpty(soundUrlDict) && !soundUrlDict.contains("http")) {
//如果包含"/" 则调用手机文件系统内的音频 例:/storage/emulated/0/KuwoMusic/music/雪.mp3
File file = new File(soundUrlDict);
FileInputStream fis = new FileInputStream(file);
mediaPlayer.setDataSource(fis.getFD());
}else {
//调用网络音频 例:http://****/xxx.mp3
mediaPlayer.setDataSource(soundUrlDict);
}
//异步准备播放
mediaPlayer.prepareAsync();
//开始播放
mediaPlayer.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mediaPlayer) {
mediaPlayer.start();
}
});
//释放MediaPlayer对象
mediaPlayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (mp != null) {
mp.release();
}
Log.d(TAG, "onCompletion: play sound.");
}
});
mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
@Override
public boolean onError(MediaPlayer mediaPlayer, int i, int i1) {
Log.d(TAG, "Play online sound onError: " + i + ", " + i1);
return false;
}
});
} catch (IOException e1) {
Log.e(TAG, "url: ", e1);
}
}
二、解释
这段代码实现了在线播放音乐的功能。它接收一个参数 soundUrlDict,代表音乐的地址。
- 如果地址中不包含斜杠(/),则说明该地址指向应用程序的 assets 目录中的音频文件,程序会从该目录获取音频文件的AssetFileDescriptor,然后设置 MediaPlayer 的数据源为该文件。
- 如果地址中包含斜杠但不包含 “http”,则说明该地址指向手机文件系统内的音频文件,程序会从该文件获取FileInputStream,然后设置 MediaPlayer的数据源为该文件。
- 如果地址中包含 “http”,则说明该地址指向网络上的音频文件,程序会直接设置MediaPlayer的数据源为该地址。然后程序异步准备播放,并在准备完成后开始播放。当播放完成后,程序会释放 MediaPlayer对象。
- 如果在播放过程中出现错误,则程序会打印错误信息。 根据具体场景具体使用。