姊妹篇
【Android】音乐播放器边播边缓存(一)AndroidVideoCache的使用方法
【Android】音乐播放器边播边缓存(二)AndroidVideoCache的后台播放
当你好不容易找到了一个完美的边播边缓存的音乐播放器框架,(不知道该怎么形容的)产品经理忽然换需求了????一定要先下载再播放???!!!心里千万匹羊驼呼啸而过。但是还是得改不是?开始吧。
1.思路1,改AndroidVideoCache的源码,在没有缓存的时候,设置播放器为暂停状态,改了八百年未果,直接checkout了
2.思路2,自己实现下载过程。具体实现思路为
① if (proxy.isCached(musicUrl)) 用代理先判断是否已缓存。
② 如果已缓存,逻辑不变正常播放;如果未缓存,开启一个下载线程。
class downloadThread extends Thread {
public void run() {
DownloadUtils.download(MusicPlayActivity.this, TAG, "https://" + targetUrl);
Message msg = new Message();
msg.what = MUSIC_DOWN_FINISH;
mHandler.sendMessage(msg);
}
}
public static void download(Context context, String tag, String downloadUrl) {
InputStream is = null;
FileOutputStream os = null;
try {
URL url = new URL(downloadUrl);
//打开连接
URLConnection conn = url.openConnection();
//打开输入流
is = conn.getInputStream();
//获得长度
int contentLength = conn.getContentLength();
Log.d(tag, "contentLength = " + contentLength);
//创建文件夹 /files/music/audio-cache/
String dirName = context.getExternalFilesDir("music") + DOWNLOAD_FILE_NAME;
File file = new File(dirName);
//不存在创建
if (!file.exists()) {
file.mkdir();
}
//下载后的文件名
String musicName = generateMusicName(downloadUrl);
String fileName = dirName + musicName + ".download";
File file1 = new File(fileName);
if (file1.exists()) {
file1.delete();
}
//创建字节流
byte[] bs = new byte[1024];
int len;
os = new FileOutputStream(fileName);
//写数据
while ((len = is.read(bs)) != -1) {
Log.d(tag, "downloading");
os.write(bs, 0, len);
}
//完成后关闭流
Log.d(tag, "download-finish");
file1.renameTo(new File(dirName + musicName));
Toast.makeText(context, "下载完成啦,我去好棒棒", Toast.LENGTH_LONG).show();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (os != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
③下载完成后,向UI线程发送一条消息,通知界面更新,并且开始播放音乐
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
//修改用户界面
switch (msg.what) {
case MUSIC_DOWN_FINISH:
if (DownloadUtils.isCached(MusicPlayActivity.this, targetUrl)) {
if (dialog != null) {
dialog.dismiss();
}
musicPlayBinder.setMusicId(musicId);
playbackControlView.setMusicName(musicName);
playbackControlView.setDiscMove(MusicPlayActivity.this, imageUrl);
musicPlayBinder.setMusicUrl2(targetUrl, selPosition, musicType, imageUrl);
} else {
if (dialog != null) {
dialog.setMessage("下载失败" + DownloadUtils.generateMusicName(targetUrl));
dialog.setCancelable(true);
}
}
break;
default:
break;
}
}
};
④效果图,如下 ↓
扫描二维码关注公众号,回复:
1979556 查看本文章
写在后面:
就很难受,强行改造了一个支持边播边缓存的框架,改成下载后才播,那我为什么不用一个普通的音乐播放器呢????
啥都不说了,搬砖去了。