IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android进阶之路 - 批量下载、缓存图片、视频 -> 正文阅读

[移动开发]Android进阶之路 - 批量下载、缓存图片、视频

之前已经记录过,批量下载图片和缓存本地的方式,此篇主要记录批量下载图片、视频,同时缓存在本地的功能实现

关联篇

在此之前,我记录过一篇 主讲 - 批量下载、缓存图片,此篇可以作为上篇的进阶扩展,优化了调用场景和使用方式~

关于实现批量下载、缓存功能,主要使用了以下几方面的知识

基础配置

加入以下权限

    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

build.gradle(app)

	//okHttpUtils网络框架
    implementation 'com.squareup.okhttp3:okhttp:3.11.0'
    implementation 'com.squareup.okio:okio:1.15.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.11.0'
 	//glide图片框架
    implementation 'com.github.bumptech.glide:glide:4.3.1'
    annotationProcessor('com.github.bumptech.glide:compiler:4.3.1')
    implementation 'com.github.bumptech.glide:okhttp3-integration:4.3.1'
    //greenDao数据库框架
    implementation 'org.greenrobot:greendao:3.3.0'
    implementation 'org.greenrobot:greendao-generator:3.3.0'

BannerInfo

在下方code中用到的bean,用于区分下载类型、地址、存储状态

package com.nk.machine.shop.model;

import java.io.Serializable;

/**
 * @author MrLiu
 * @date 2021/3/12
 * desc
 */
public class BannerInfo implements Serializable {
    /**
     * 图片地址
     */
    private String picUrl;

    /**
     * type分类 1:图片 2:视屏
     */
    private int type;

    /**
     * 无效的本地资源的状态
     * 0:非本地资源
     * 1:有效的本地资源
     */
    private int validLocalState = 0;

    public int getValidLocalState() {
        return validLocalState;
    }

    public void setValidLocalState(int validLocalState) {
        this.validLocalState = validLocalState;
    }
    
    public String getPicUrl() {
        return picUrl;
    }

    public void setPicUrl(String picUrl) {
        this.picUrl = picUrl;
    }

    public int getType() {
        return type;
    }

    public void setType(int type) {
        this.type = type;
    }
}

图片下载

    /**
     * 优化版 - 单图下载
     */
    public void downAloneImg(int source, BannerInfo info) {
        LogTool.e("提示:开始下载图片");
        String picUrl = info.getPicUrl();
        new Thread(() -> {
            File file = GlideTool.downImageFile(NkApplication.getAppContext(), picUrl);
            Bitmap bitmap = BitmapFactory.decodeFile(file.toString());
           /* 因为我针对不同场景保存图片的地方有所不同,所以做了渠道分配,常规使用的话直接存储固定地址即可
           if (source == 1) {
                saveAloneImg(info, bitmap, Constant.LocalPath.BANNER_PATH);
            } else if (source == 2) {
                saveAloneImg(info, bitmap, Constant.LocalPath.CERTIFICATE_PATH);
            } else {
                saveAloneImg(info, bitmap, Constant.LocalPath.DEFAULT_PATH);
            }*/
            
            saveAloneImg(info, bitmap, Environment.getExternalStorageDirectory().getPath() + "/default");
        }).start();
    }

    /**
     * 优化版 - 保存图片
     */
    public void saveAloneImg(BannerInfo info, Bitmap bitmap, String path) {
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }
        try {
            String tmpImgPath = path + "/" + System.currentTimeMillis() + ".png";
            FileOutputStream fileOutputStream = new FileOutputStream(tmpImgPath);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
            fileOutputStream.close();

            int type = info.getType();
            String picUrl = info.getPicUrl();
            int interval = info.getInterval();
            LogTool.e("图片保存成功,tmpImgPath=" + tmpImgPath);
            DaoStrategy.getInstance(new LyPicture(1, interval, type, picUrl, tmpImgPath)).insert();
        } catch (Exception e) {
            LogTool.e(e.getMessage());
        }
    }

视频下载

    /**
     * 优化版 -  视频下载
     */
    public void downAloneVideo(int source, BannerInfo info) {
        String picUrl = info.getPicUrl();
        LogTool.e("提示:开始下载视频"+picUrl));
        //定义存储路径
        String path = "";
        //如果不需要分渠道做优化,则可固定一个路径
        /*if (source == 1) {
            path = Constant.LocalPath.BANNER_PATH;
        } else if (source == 2) {
            path = Constant.LocalPath.CERTIFICATE_PATH;
        } else {
            path = Constant.LocalPath.DEFAULT_PATH;
        }*/
        path = Environment.getExternalStorageDirectory().getPath() + "/default";
        //定义存储文件名
        String tmpFileName = System.currentTimeMillis() + ".mp4";
        //开始下载
        OkHttpUtils.get()
                .url(picUrl)
                .build()
                .execute(new FileCallBack(path, tmpFileName) {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        LogTool.e("视频下载错误:" + e.getMessage());
                        downAloneVideo(source, info);
                    }

                    @Override
                    public void onResponse(File response, int id) {
                        LogTool.e("视频下载成功"+response.getAbsolutePath());
                        //将数据保存到数据库中
                        DaoStrategy.getInstance(new LyPicture(1, interval, info.getType(), picUrl, response.getAbsolutePath())).insert();
                    }
                });

完整封装

public class DownLoadUtil{
 	/**
     * 下载视频、图片
     */
    public static synchronized void downVideoImg(List<BannerInfo> bannerList) {
        //检测本地数据库数据
        List<PictureEntity> localList = (List<PictureEntity>) DaoStrategy.getInstance(new LyPicture()).queryConditionList(1);
        for (int i = 0; i < bannerList.size(); i++) {
            BannerInfo info = bannerList.get(i);
            //检测本地数据库资源,查询是否存在已下载的资源,减少重复下载,提升效率(如不需要可删除)
            if (localList.size() >= 1) {
                for (int j = 0; j < localList.size(); j++) {
                    if (info.getPicUrl().equals(info.getPicUrl())) {
                        LogTool.e("提示:本地已有该资源");
                        return;
                    }
                }
            }
			//必有:主要判断是下载图片还是视频
            if (info.getType() == 2) {
                downAloneVideo(1, bannerList.get(i));
            } else {
                downAloneImg(1, bannerList.get(i));
            }
        }
    }

    /**
     * 优化版 - 单图下载
     */
    public void downAloneImg(int source, BannerInfo info) {
        LogTool.e("提示:开始下载图片");
        String picUrl = info.getPicUrl();
        new Thread(() -> {
            File file = GlideTool.downImageFile(NkApplication.getAppContext(), picUrl);
            Bitmap bitmap = BitmapFactory.decodeFile(file.toString());
            if (source == 1) {
                saveAloneImg(info, bitmap, Constant.LocalPath.BANNER_PATH);
            } else if (source == 2) {
                saveAloneImg(info, bitmap, Constant.LocalPath.CERTIFICATE_PATH);
            } else {
                saveAloneImg(info, bitmap, Constant.LocalPath.DEFAULT_PATH);
            }
        }).start();
    }

    /**
     * 优化版 - 保存图片
     */
    public void saveAloneImg(BannerInfo info, Bitmap bitmap, String path) {
        File file = new File(path);
        if (!file.exists()) {
            file.mkdir();
        }
        try {
            String tmpImgPath = path + "/" + System.currentTimeMillis() + ".png";
            FileOutputStream fileOutputStream = new FileOutputStream(tmpImgPath);
            bitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOutputStream);
            fileOutputStream.close();

            int type = info.getType();
            String picUrl = info.getPicUrl();
            int interval = info.getInterval();
            LogTool.e("图片保存成功,tmpImgPath=" + tmpImgPath);
            DaoStrategy.getInstance(new LyPicture(1, interval, type, picUrl, tmpImgPath)).insert();
        } catch (Exception e) {
            LogTool.e(e.getMessage());
        }
    }

    /**
     * 优化版 -  视频下载
     */
    public void downAloneVideo(int source, BannerInfo info) {
        LogTool.e("提示:开始下载视频"+info.getPicUrl());
        String picUrl = info.getPicUrl();
        int interval = info.getInterval();
        String path = "";
        if (source == 1) {
            path = Constant.LocalPath.BANNER_PATH;
        } else if (source == 2) {
            path = Constant.LocalPath.CERTIFICATE_PATH;
        } else {
            path = Constant.LocalPath.DEFAULT_PATH;
        }
        String tmpFileName = System.currentTimeMillis() + ".mp4";
        OkHttpUtils.get()
                .url(picUrl)
                .build()
                .execute(new FileCallBack(path, tmpFileName) {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        LogTool.e("视频下载错误:" + e.getMessage());
                        downAloneVideo(source, info);
                    }

                    @Override
                    public void onResponse(File response, int id) {
                        LogTool.e("视频下载成功"+response.getAbsolutePath());
                        DaoStrategy.getInstance(new LyPicture(1, interval, info.getType(), picUrl, response.getAbsolutePath())).insert();
                    }
                });
    }

使用方式

使用简单,无需关注内部实现,同时实现了单一原则,统一了下载出口

在需要下载视频、图片的地方直接调用以下代码即可

   //bannerList为需要下载的图片和视频
   DownLoadUtil.downVideoImg(bannerList);
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-12-02 16:52:58  更:2021-12-02 16:55:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 7:07:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码