3.3.2.1 Giải mã
Việc sử dụng thư viện Zxing khá dễ dàng [13]. Đầu tiên, phải khởi tạo một đối tượng thuộc lớp com.google.zxing.Reader. Chúng ta có thể sử dụng đối tượng thuộc lớp MultiFormatReader để đọc tất cả các định dạng mã vạch mà thư viện hỗ trợ.
Reader reader = new MultiFormatReader();
Nếu muốn đọc mã QR, ta có thể cài đặt để đọc theo mã QR. Ta có thể khởi tạo như sau:
Reader reader = new QRCodeReader();
Tiếp đến ta cần xác định ảnh để giải mã. Reader sẽ đọc từ một đối tượng được cài đặt từ lớp com.google.zxing.MonchromeBitmapSource, đây là một lớp trừu tượng cho các lớp mô tả hình ảnh.
Trong Java SE thư viện có sẵn lớp java.awt.BufferedImage, ta cài đặt như sau:
BufferedImage myImage = ...;
MonochromeBitmapSource source = new
Trong thư viện Android không có lớp java.awt.BufferedImage, ta cài đặt như sau:
Bitmap bmp = BitmapFactory.decodeResource( getResources(), R.drawable.barcode);
MonochromeBitmapSource source =
newRGBMonochromeBitmapSource(bmp);
Nếu ảnh là một resource (tài nguyên), R.drawable.barcode là đối tượng xác định tài nguyên đó.
Hoặc ta có thể dùng như sau:
Bitmap bmp = BitmapFactory.decodeFile("file_path"); MonochromeBitmapSource source = new
RGBMonochromeBitmapSource(bmp);
Nếu ảnh là một tập tin ngoài, file_path là đường dẫn tới tập tin đó. Giải mã
Result result = reader.decode(source);
Trong đó:
result: là đối tượng thuộc lớp com.google.zxing.Result. Lớp Result này cung cấp các phương thức để lấy giá trị byte hoặc chuỗi được mã hóa trong mã vạch nếu có. Ví dụ:
String text = result.getText();
byte[] rawBytes = result.getRawBytes();
BarcodeFormat format = result.getBarcodeFormat(); ResultPoint[] points = result.getResultPoints();
Trong đó:
result: là đối tượng thuộc lớp com.google.zxing.MonochromeBitmapSource.
Cuối cùng, bộ giải mã hỗ trợ một hệ thống “gợi ý” giúp chúng ta giải mã hiệu quả hơn, hoặc giảm độ chính xác để tăng tốc độ. Ví dụ, gợi ý “TRY_HARDER” sẽ yêu cầu bộ giải mã tăng nhiều thời gian hơn cho việc nhận dạng mã vạch:
Hashtable<DecodeHintType, Object>
hints = new Hashtable<DecodeHintType, Object>(); hints.put(DecodeHintType.TRY_HARDER, Boolean.TRUE); Result result = reader.decode(source, hints);
3.3.2.2 Mã hóa một chuỗi ra ảnh mã QR
Tự gọi: để mã hóa một chuỗi ra ảnh mã QR, ta chỉ việc tạo một Intent xác định hành động mã hóa, xác định loại và dữ liệu mã hóa sau đó gọi phương thức startActivity(). Ví dụ:
Intent intent = new
Intent("com.google.zxing.client.android.ENCODE"); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.putExtra("ENCODE_TYPE", "TEXT_TYPE"); intent.putExtra("ENCODE_DATA","HELLO WORLD"); startActivity(intent);
Sử dụng lớp IntentIntegrator
Lớp IntentIntegrator cung cấp một phương thức đơn đơn giản là IntentIntegrator.shareText() để mã hóa một chuỗi ra mã QR.
IntentIntegrator.shareText(activity, text);
3.3.2.3 Quét mã vạch từ một chương trình khác thông qua Intent
Tự gọi: nếu Barcode Scanner (bộ quét mã vạch) đã được cài đặt trên điện thoại Android, ta có thể cho nó quét và trả lại kết quả, chỉ việc thông qua một Intent. Ví dụ:
public Button.OnClickListener mScan = new
Button.OnClickListener() {
public void onClick(View v) { Intent intent = new
Intent("com.google.zxing.client.android.SCAN"); intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); startActivityForResult(intent, 0);
} };
Đoạn mã trên bắt sự kiện của một nút và gọi tới Intent của Barcode Scanner để quét mã QR.
public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == 0) { if (resultCode == RESULT_OK) { String contents = intent.getStringExtra("SCAN_RESULT"); String format = intent.getStringExtra("SCAN_RESULT_FORMAT"); // Handle successful scan
} else if(resultCode==RESULT_CANCELED) { // Handle cancel } } } }
Đoạn mã trên bắt sự kiện trả về kết quả khi Barcode Scanner quét xong. Nếu quét thành công mã resultCode sẽ là RESULT_OK, nếu Intent bị hủy thì mã resultCode sẽ là RESULT_CANCELED.
Sử dụng lớp IntentIntegrator
Lớp IntentIntegrator gọi Barcode Scanner rất đơn giản thông qua hàm sau:
IntentIntegrator.initiateScan(Activity);
Để lấy giá trị trả về, lớp IntentIntegrator có hàm parseActivityResult
protected void onActivityResult (int requestCode,
int resultCode, Intent data) { switch(requestCode) { case IntentIntegrator.REQUEST_CODE: if (resultCode == RESULT_OK) { IntentResult scanResult = IntentIntegrator.parseActivityResult( requestCode,resultCode, data); if (scanResult != null) { String strContent=scanResult.getContents(); //do here } } }
Chương 4: Xây dựng ứng dụng lưu trữ thông tin bằng chuỗi mã vạch
Nội dung của chương này sẽ đi xây dựng ứng dụng lưu trữ thông tin bằng chuỗi mã vạch, một ứng dụng dựa trên nền tảng Android, sử dụng thư viện Zxing cùng mã vạch QR.