Reputation: 229
I have a zipped password protected a video file saved on sd card on android emulator. Now i want to unzip that video file on sd card through code. How can i achieve that? Any help or code? Thanks in advance
Upvotes: 17
Views: 27901
Reputation: 371
Other answers not really work on sdcard(Environment.getExternalStorageDirectory() != SDCARD) in kitkat and above. but you can use this code for api 21 and above! for more help to get zipDocumentFile read this :
/**
* @return true->successful
*/
public static Boolean unzip(Context context, DocumentFile zipDocumentFile) {
try {
InputStream inputStream = context.getContentResolver().openInputStream(zipDocumentFile.getUri());
assert inputStream != null;
ZipInputStream zipInputStream = new ZipInputStream(new BufferedInputStream(inputStream, BUFFER_SIZE));
ZipEntry ze;
while ((ze = zipInputStream.getNextEntry()) != null) {
if (ze.isDirectory()) {
String[] paths = ze.getName().split("/");
DocumentFile documentFile = null;
for (String path : paths) {
if (documentFile == null) {
documentFile = zipDocumentFile.getParentFile().findFile(path);
if (documentFile == null)
documentFile = zipDocumentFile.getParentFile().createDirectory(path);
} else {
DocumentFile newDocumentFile = documentFile.findFile(path);
if (newDocumentFile == null) {
documentFile = documentFile.createDirectory(path);
} else {
documentFile = newDocumentFile;
}
}
}
if (documentFile == null || !documentFile.exists())
return false;
} else {
String[] paths = ze.getName().split("/");
//Make Folders
DocumentFile documentFile = null;
for (int i = 0; i < paths.length - 1; i++) {
if (documentFile == null) {
documentFile = zipDocumentFile.getParentFile().findFile(paths[i]);
if (documentFile == null)
documentFile = zipDocumentFile.getParentFile().createDirectory(paths[i]);
} else {
DocumentFile newDocumentFile = documentFile.findFile(paths[i]);
if (newDocumentFile == null) {
documentFile = documentFile.createDirectory(paths[i]);
} else {
documentFile = newDocumentFile;
}
}
}
DocumentFile unzipDocumentFile;
if (documentFile == null) {
unzipDocumentFile = zipDocumentFile.getParentFile().createFile(URLConnection.guessContentTypeFromName(ze.getName()), paths[paths.length - 1]);
} else {
unzipDocumentFile = documentFile.createFile(URLConnection.guessContentTypeFromName(ze.getName()), paths[paths.length - 1]);
}
// unzip the file
OutputStream outputStream = context.getContentResolver().openOutputStream(unzipDocumentFile.getUri());
int read;
byte[] data = new byte[BUFFER_SIZE];
assert outputStream != null;
while ((read = zipInputStream.read(data, 0, BUFFER_SIZE)) != -1)
outputStream.write(data, 0, read);
zipInputStream.closeEntry();
}
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
Upvotes: 2
Reputation: 3573
To unpacking the password protected file use this library:
http://www.lingala.net/zip4j/download.php
it is so easy.
ZipFile zipFile = new ZipFile(YourZipFile);
if(zipFile.isEncrypted())
zipFile.setPassword(Password);
zipFile.extractAll(Destination);
Upvotes: 5
Reputation: 25876
This is slightly more cleaner version of Samir's code with using Apache's IOUtils.copy()
for copying files and finally
block. If you have large files in archive then better use IOUtils.copyLarge()
.
import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
public class ZipUtils {
public static void unzip(InputStream is, File path) {
checkDir(path);
ZipInputStream zis = null;
FileOutputStream fos = null;
try {
zis = new ZipInputStream(is);
ZipEntry ze;
while ((ze = zis.getNextEntry()) != null) {
File entryFile = new File(path, ze.getName());
if (ze.isDirectory()) {
checkDir(entryFile);
} else {
fos = new FileOutputStream(entryFile);
IOUtils.copy(zis, fos);
fos.close();
fos = null;
}
zis.closeEntry();
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (zis != null) {
try {
zis.close();
} catch (IOException ignore) {
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException ignore) {
}
}
}
}
private static void checkDir(File path) {
if (!path.exists()) {
path.mkdirs();
} else if (!path.isDirectory()) {
throw new IllegalArgumentException("Path is not directory");
}
}
}
Upvotes: 2
Reputation: 40426
import android.util.Log;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
*
* @author jon
*/
public class Decompress {
private String _zipFile;
private String _location;
public Decompress(String zipFile, String location) {
_zipFile = zipFile;
_location = location;
_dirChecker("");
}
public void unzip() {
try {
FileInputStream fin = new FileInputStream(_zipFile);
ZipInputStream zin = new ZipInputStream(fin);
ZipEntry ze = null;
while ((ze = zin.getNextEntry()) != null) {
Log.v("Decompress", "Unzipping " + ze.getName());
if(ze.isDirectory()) {
_dirChecker(ze.getName());
} else {
FileOutputStream fout = new FileOutputStream(_location + ze.getName());
for (int c = zin.read(); c != -1; c = zin.read()) {
fout.write(c);
}
zin.closeEntry();
fout.close();
}
}
zin.close();
} catch(Exception e) {
Log.e("Decompress", "unzip", e);
}
}
private void _dirChecker(String dir) {
File f = new File(_location + dir);
if(!f.isDirectory()) {
f.mkdirs();
}
}
}
In your case::
String zipFilename = Environment.getExternalStorageDirectory() + "/files.zip";
String unzipLocation = Environment.getExternalStorageDirectory() + "/unzipped/";
Decompress d = new Decompress(zipFilename, unzipLocation);
d.unzip();
Upvotes: 23