[Lập trình Android] Hướng dẫn giải nén một tập tin *.zip tải từ Internet trong ứng dụng Android

Đầu tiên, tạo một ứng dụng Android và đặt tên là UnzipFile với Activity chính là MainActivity.
Chúng ta bắt đầu bằng việc thêm permission cho ứng dụng. Mở tập tin Android Manifest, thêm vào 2 permission sau

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

Quyền truy cập Internet để download tập tin *.zip về, sau đó sử dụng quyền ghi lên bộ nhớ ngoài để giải nén được tập tin.
Tiếp theo, chúng ta cần một class để giải nén tập tin. Tạo một class mới đặt tên là UnzipUtil, với nội dung sau

public class UnzipUtil {
	private String _zipFile;
	private String _location;
 
	public UnzipUtil(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) {
				if (ze.isDirectory()) {
					_dirChecker(ze.getName());
				} else {
					FileOutputStream fout = new FileOutputStream(_location
							+ ze.getName());
					byte[] buffer = new byte[8192];
					int len;
					while ((len = zin.read(buffer)) != -1) {
						fout.write(buffer, 0, len);
					}
					fout.close();
					zin.closeEntry();
				}
			}
			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();
		}
	}
}

Chúng ta sẽ sử dụng class này để giải nén một tập tin *.zip từ đường dẫn zipFile vào trong thư mục có đường dẫn location.
Tiếp theo, ta chỉnh sửa lại MainActivity để thực hiện việc download và giải nén *.zip.
Đầu tiên, ta khai báo một số biến cần dùng cho ứng dụng

	private ProgressDialog mProgressDialog;
	String unzipLocation = Environment.getExternalStorageDirectory() + "/";
	String zipFile = Environment.getExternalStorageDirectory()
			+ "/download.zip";

Giả sử ta sẽ download tập tin *.zip từ đường dẫn: http://yeulaptrinh.vn/demo/down.zip
Tiếp theo, trong onCreate của MainActivity, chúng ta sẽ chạy một AsyncTask để download *.zip

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		DownloadMapAsync mew = new DownloadMapAsync();
		mew.execute("http://yeulaptrinh.vn/demo/down.zip");
	}

Nội dung của DownloadMapAsync như sau

	class DownloadMapAsync extends AsyncTask<String, String, Void> {
		boolean result;
 
		@Override
		protected void onPreExecute() {
			super.onPreExecute();
			mProgressDialog = new ProgressDialog(MainActivity.this);
			mProgressDialog.setMessage("Downloading Zip File..");
			mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
			mProgressDialog.setCancelable(false);
			mProgressDialog.show();
		}
 
		@Override
		protected Void doInBackground(String... aurl) {
			int count;
			try {
				URL url = new URL(aurl[0]);
				URLConnection conexion = url.openConnection();
				conexion.connect();
				int lenghtOfFile = conexion.getContentLength();
				InputStream input = new BufferedInputStream(url.openStream());
				OutputStream output = new FileOutputStream(zipFile);
				byte data[] = new byte[1024];
				long total = 0;
				while ((count = input.read(data)) != -1) {
					total += count;
					publishProgress("" + (int) ((total * 100) / lenghtOfFile));
					output.write(data, 0, count);
				}
				output.close();
				input.close();
				result = true;
			} catch (Exception e) {
				result = false;
			}
			return null;
		}
 
		protected void onProgressUpdate(String... progress) {
			mProgressDialog.setProgress(Integer.parseInt(progress[0]));
		}
 
		@Override
		protected void onPostExecute(Void params) {
			mProgressDialog.dismiss();
			if (result) {
				new UnZipTask().execute();
			} else {
				Toast.makeText(MainActivity.this, "Download failed",
						Toast.LENGTH_SHORT).show();
			}
		}
	}

Sau khi download xong tập tin vào trong đường dẫn zipFile, chúng ta sẽ tiếp tục cho chạy một AsyncTask khác để giải nén tập tin, đó là

new UnZipTask().execute();

Nội dung UnZipTask như sau:

	private class UnZipTask extends AsyncTask<Void, Void, Boolean> {
 
		@Override
		protected void onPreExecute() {
			mProgressDialog = new ProgressDialog(MainActivity.this);
			mProgressDialog
					.setMessage("Please Wait...Extracting zip file ... ");
			mProgressDialog.setProgressStyle(ProgressDialog.STYLE_SPINNER);
			mProgressDialog.setCancelable(false);
			mProgressDialog.show();
		}
 
		@Override
		protected Boolean doInBackground(Void... params) {
			try {
				UnzipUtil d = new UnzipUtil(zipFile, unzipLocation);
				d.unzip();
			} catch (Exception e) {
				return false;
			}
			return true;
		}
 
		@Override
		protected void onPostExecute(Boolean result) {
			mProgressDialog.dismiss();
			if (!result) {
				Toast.makeText(MainActivity.this, "Unzip failed",
						Toast.LENGTH_SHORT).show();
			}
		}
	}

Chúng ta sử dụng class UnzipUtil đã tạo ở trên để giải nén

				UnzipUtil d = new UnzipUtil(zipFile, unzipLocation);
				d.unzip();

Nếu sử dụng máy ảo để chạy thử ứng dụng, bạn mở phần quản lý File của máy ảo sẽ thấy tập tin down.zip được download và các tập tin giải nén từ down.zip.

Khuyên dùng

 

About Aida Nana

Nghề chính là chém gió, quăng bom và ném lựu đạn.
Nghề phụ là cắt cỏ, chém chuối, cưa cây......

Speak Your Mind

*