【Android】音乐播放器边播边缓存(三)AndroidVideoCache的先下载再播放

姊妹篇

【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 查看本文章



写在后面:

就很难受,强行改造了一个支持边播边缓存的框架,改成下载后才播,那我为什么不用一个普通的音乐播放器呢????

啥都不说了,搬砖去了。

猜你喜欢

转载自blog.csdn.net/crab0314/article/details/80548007