【Android】音乐播放器边播边缓存(三)AndroidVideoCache的先下载再播放
16lz
2021-01-25
姊妹篇
【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; } } };
④效果图,如下 ↓
写在后面:
就很难受,强行改造了一个支持边播边缓存的框架,改成下载后才播,那我为什么不用一个普通的音乐播放器呢????
啥都不说了,搬砖去了。
更多相关文章
- 音乐你的生活—Android(安卓)QQMusic 设计实录
- Android(安卓)AppWidget(桌面小部件-音乐播放动画)
- Android(安卓)SharePreference 总结
- android显示缓存大小和清除缓存功能
- Android(安卓)对Bitmap的内存优化
- Android(安卓)异步加载图片
- Android(安卓)编译基础知识
- android音乐播放器开发在线加载歌词
- Java(Android)数据结构汇总(二)-- Set(上)