Android 解压缩包zip

最近公司提了个需求,要求动态设置icon。什么意思呢? 因为之前过年的时候,我们的app为了迎合过年的喜气,所有首页部分icon改成了象征春节的icon,因为每次更换需重新打包发版,导致更改周期长,不方便。 于是就提了这个需求,要求接收服务器发来的一个压缩包,压缩包里包含了指定的图片,下载后设置到icon上。

根据这个需求分析呢, 首先我需要解压缩 文件。

我用的AsyncTask.

//书写的调用下载方法。
public void getFileImg(Context context) {
    initData(context);//控制下载路径,方便解压
    DownloadTask downloadTask = new DownloadTask();//下载
    downloadTask.execute();
}

//控制下载文件路径,以及文件解压路径。 判断是否已有文件夹,么有创建。

public void initData(Context context) {
    try {
        mDownloadUrl = Environment.getDataDirectory() + "/data/" + context.getPackageName() + "/";//下载文件路径
        oDownloadUrl = Environment.getDataDirectory() + "/data/" + context.getPackageName() + "/main_img";//解压文件路径
        mUrl = new URL("*******elm1.zip");//zip网址

        mFileName = new File(mUrl.getFile()).getName();
        mFile = new File(mDownloadUrl, mFileName);
        Log.e(TAG, "out=" + mDownloadUrl + ", name=" + mFileName + ",mUrl.getFile()=" + mUrl.getFile());

        if (mFile.exists()) {//判断是否已有文件。
            mFile.delete();
        } else {
            mFile.mkdirs();
        }
        if (mFile.exists())
            Log.e(TAG, "存在");
        else
            Log.e(TAG, "不存在");

    } catch (MalformedURLException e) {
        e.printStackTrace();
    }
}
//下载文件
private class DownloadTask extends AsyncTask<Void, Integer, Long> {

    @Override
    protected Long doInBackground(Void... params) {
        return download();
    }

    @Override
    protected void onPostExecute(Long aLong) {
        super.onPostExecute(aLong);
        ProgressHelper.hide();
        ToaskUtils.showToast("下载结束:正在分解");//自己封装的toast
        try {
            zipFile = new ZipFile(mDownloadUrl + "/" + mFileName);
            if (null != zipFile) {
                ZipExtractorTask task = new ZipExtractorTask();//下载结束调用解压
                task.execute();
            } else {
                ToaskUtils.showToast("请刷新当前页面");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private long download() {
        URLConnection connection = null;
        int bytesCopied = 0;
        try {
            try {
                connection = mUrl.openConnection();
            } catch (IOException e) {
                e.printStackTrace();
            }
            int length = connection.getContentLength();
            if (mFile.exists() && length == mFile.length()) {
                Log.e(TAG, "文件" + mFile.getName() + "已存在!!");
                return 0l;
            }
            mOutputStream = new FileOutputStream(mFile);
            bytesCopied = copy(connection.getInputStream(), mOutputStream);
            if (bytesCopied != length && length != -1) {
                Log.e(TAG, "Download incomplete bytesCopied=" + bytesCopied + ", length" + length);
            }
            Log.e(TAG, "文件长度" + mFile.length());
            mOutputStream.close();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return bytesCopied;
    }
}

文件已经下载完毕, 接下来就是 解压文件夹了。 因为公司给的是zip格式,所以文章无其他压缩格式解压方式。

调用解压:

private class ZipExtractorTask extends AsyncTask<Void, Integer, Long> {

    @Override
    protected Long doInBackground(Void... params) {
        return unzip(); **解压
    }

    @Override
    protected void onPostExecute(Long aLong) {
        super.onPostExecute(aLong);
        ToaskUtils.showToast("分解完毕");
        String img_path = oDownloadUrl + "/" + oFileName;  **oDownLoad为解压地址
        Bitmap bmp = BitmapFactory.decodeFile(img_path);
        getBitmap.setBitmap(bmp);  **getBitmap为自定义接口回调,可自己定义。
    }
}
private long unzip() {**上述调用压缩方式
    long extractedSize = 0L;
    Enumeration<ZipEntry> entries;
    try {
        entries = (Enumeration<ZipEntry>) zipFile.entries();
        while (entries.hasMoreElements()) {
            ZipEntry entry = entries.nextElement();
            if (entry.isDirectory()) {
                continue;
            }
            oFileName = entry.getName();
            File destination = new File(oDownloadUrl, entry.getName());
            if (!destination.getParentFile().exists()) {
                Log.e(TAG, "make=" + destination.getParentFile().getAbsolutePath());
                destination.getParentFile().mkdirs();
            }
            if (destination.exists()) {

            }
            FileOutputStream outStream = new FileOutputStream(destination);
            extractedSize += copy(zipFile.getInputStream(entry), outStream);
            outStream.close();
        }
    } catch (ZipException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            zipFile.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return extractedSize;
}

基本已经完毕了,当前只获取了一张图片,如果你需要更多, 则需要你自己进行处理,这里就不说了。

再解压缩完毕之后,转换为bitmap。其中getBitmap是我自己定义的接口,你可以自己定义。

public void setGetBitmap(getBitmap getBitmap) {//为了回调到首页。
    this.getBitmap = getBitmap;
}

public interface getBitmap {
    void setBitmap(Bitmap bitmap);
}

效果图:


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容