Android download a zip file and unpack it

Make sure the INTERNET and WRITE_EXTERNAL_STORAGE permissions are granted in the manifest file.

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

This method will download the file from the provided url and save it to destinationFilePath. This method should be run in a background thread.

public void downloadZipFile(String urlStr, String destinationFilePath) {
    InputStream input = null;
    OutputStream output = null;
    HttpURLConnection connection = null;
    try {
        URL url = new URL(urlStr);

        connection = (HttpURLConnection) url.openConnection();
        connection.connect();

        if (connection.getResponseCode() != HttpURLConnection.HTTP_OK) {
            Log.d("downloadZipFile", "Server ResponseCode=" + connection.getResponseCode() + " ResponseMessage=" + connection.getResponseMessage());
        }

        // download the file
        input = connection.getInputStream();

        Log.d("downloadZipFile", "destinationFilePath=" + destinationFilePath);
        new File(destinationFilePath).createNewFile();
        output = new FileOutputStream(destinationFilePath);

        byte data[] = new byte[4096];
        int count;
        while ((count = input.read(data)) != -1) {
            output.write(data, 0, count);
        }
    } catch (Exception e) {
        e.printStackTrace();
        return;
    } finally {
        try {
            if (output != null) output.close();
            if (input != null) input.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

        if (connection != null) connection.disconnect();
    }

    File f = new File(destinationFilePath);

    Log.d("downloadZipFile", "f.getParentFile().getPath()=" + f.getParentFile().getPath());
    Log.d("downloadZipFile", "f.getName()=" + f.getName().replace(".zip", ""));
}

Sample usage of the above method.

File gameDir = new File("/data/data/" + getActivity().getPackageName() + "/games");
gameDir.mkdirs();
downloadZipFile("https://github.com/gabrielecirulli/2048/archive/master.zip", "/data/data/" + getActivity().getPackageName() + "/games/2048.zip");

This method will unzip/unpack the zip file into the current folder, given the absolute path of the zip file. Ex: /var/example/game.zip -> /var/example/game

public boolean unpackZip(String filePath) {
    InputStream is;
    ZipInputStream zis;
    try {

        File zipfile = new File(filePath);
        String parentFolder = zipfile.getParentFile().getPath();
        String filename;

        is = new FileInputStream(filePath);
        zis = new ZipInputStream(new BufferedInputStream(is));
        ZipEntry ze;
        byte[] buffer = new byte[1024];
        int count;

        while ((ze = zis.getNextEntry()) != null) {
            filename = ze.getName();

            if (ze.isDirectory()) {
                File fmd = new File(parentFolder + "/" + filename);
                fmd.mkdirs();
                continue;
            }

            FileOutputStream fout = new FileOutputStream(parentFolder + "/" + filename);

            while ((count = zis.read(buffer)) != -1) {
                fout.write(buffer, 0, count);
            }

            fout.close();
            zis.closeEntry();
        }

        zis.close();
    } catch(IOException e) {
        e.printStackTrace();
        return false;
    }

    return true;
}

Sample usage of the above method for unpacking a zip file. This method is better off to run in a background task.

unpackZip("/var/example/game.zip");

Put the above together in an AsyncTask embedded in a Fragment.

Search within Codexpedia

Custom Search

Search the entire web

Custom Search