Другие ответы не очень работают на SDCard (Environment.getExternalStorageDirectory ()! = SDCARD) в kitkat и выше.но вы можете использовать этот код для API 21 и выше!для получения дополнительной помощи, чтобы получить zipDocumentFile читайте это :
/**
* @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;
}
}