这边的需求是仅仅是实现一个音乐的边下边播。思路就是截取后台返回的音乐链接。然后截取文件名,判断该文件是否在文件夹下存在。存在就使用sd卡的文件源进行播放,不存在就下载这个音乐文件,并且播放这个音乐链接。使用的是android自带的DownloadManager进行下载。默认是带标题栏的下载进度显示的,我们需要隐藏掉需要在清单文件下面进行配置, 需要权限隐藏
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
否则会抛出异常
DownloadManager.Request.setNotificationVisibility fails with jSecurityException: invalid value for visibility: 1
上代码,思路比较清晰
1、下载音乐文件
//下载音乐文件
private void downloadMusic(String url) {
if (mMediaplayer == null) {
//初始化
mMediaplayer = new MediaPlayer();
mMediaplayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
mMediaplayer.setLooping(true);
}
String path = url;
//创建下载任务,downloadUrl就是下载链接
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(path));
String fileName = path.substring(path.lastIndexOf("/") + 1, path.length());
downloadPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).getAbsolutePath() + File.separator + fileName;
File f = new File(downloadPath);
if (f.exists()) {
//重新设置资源
try {
mMediaplayer.reset();
mMediaplayer.setDataSource(downloadPath);
mMediaplayer.prepare();
mMediaplayer.start();
JLog.e("file already exists!");
} catch (IOException e) {
e.printStackTrace();
}
return;
} else {
//播放音乐
palyUrl(url);
}
//指定下载路径和下载文件名
request.setDestinationInExternalPublicDir("/download/", fileName);
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_HIDDEN);
request.setVisibleInDownloadsUi(false);
//获取下载管理器
downloadManager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
//将下载任务加入下载队列,否则不会进行下载
mTaskId = downloadManager.enqueue(request);
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
}
//广播接受者,接收下载状态
private BroadcastReceiver receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
checkDownloadStatus();//检查下载状态
}
};
//检查下载状态
private void checkDownloadStatus() {
DownloadManager.Query query = new DownloadManager.Query();
query.setFilterById(mTaskId);//筛选下载任务,传入任务ID,可变参数
Cursor c = downloadManager.query(query);
if (c.moveToFirst()) {
int status = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
switch (status) {
case DownloadManager.STATUS_PAUSED:
case DownloadManager.STATUS_PENDING:
case DownloadManager.STATUS_RUNNING:
break;
case DownloadManager.STATUS_SUCCESSFUL:
break;
case DownloadManager.STATUS_FAILED:
break;
}
}
}
2、mediaplayer播放url
/**
* 播放音乐
*
* @param url
*/
public void palyUrl(String url) {
try {
mMediaplayer.reset();
mMediaplayer.setDataSource(url);
mMediaplayer.prepare();
mMediaplayer.start();
} catch (IOException | IllegalArgumentException e) {
e.printStackTrace();
}
}
3、本来是想在下载完成后切换播放源的。mMediaplayer.setDataSource(url);,所以定义了广播,监听是否下载完成,下载完成后切换播放源。然而实现不了,如果有更好的方法,请告知。而且系统自带的下载不是断点续传的。所以只是实现了,每次进入判断是否存在该文件,不存在就下载,第二次进入存在就直接播放了。这么简单就不上代码了,have a nice day