Quét mã vạch với Mobile Vision API

1. Giới thiệu:

Trước đây, khi làm việc với mã vạch trong Android, chúng ta thường sử dụng ZXing hoặc một vài thư viện của bên thứ 3. Tuy nhiên, trong phiên bản Google Play Services 7.8 trở lên, Google đã tích hợp tính năng mới trong Mobile Vision API để hỗ trợ đọc và giải mã các loại mã vạch một cách nhanh chóng, dễ dàng và không cần truy xuất dữ liệu bên ngoài.

Nhận dạng mã vạch

Tất cả cả các class để nhận dạng và phân tích cú pháp mã vạch đều nằm trong namespace com.google.android.gms.vision.barcode. Class BarcodeDetector đóng vai trò chính trong việc xử lý các đối tượng Frame trả về kiểu ***SparseArray<Barcode>***.

Mỗi kiểu mã vạch được đại diện bằng một kiểu trình bày đã được công nhận và giá trị đi kèm.

Với mã vạch kiểu 1D (mã UPC), giá trị là các con số được mã hóa bằng các cột mã với độ rộng khác nhau và giá trị này sẽ tồn tại trong thuộc tính rawValue khi được nhận dạng.

Với mã vạch 2D chứa dữ liệu có cấu trúc (mã QR), trường valueFormat chứa kiểu giá trị đã được nhận dạng và các trường dữ liệu tương ứng. Ví dụ, nếu kiểu URL được nhận dạng, URL cố định sẽ được lưu vào valueFormat và Barcode.UrlBookmark sẽ chứa giá trị URL. Ngoài URL còn có nhiều kiểu dữ liệu khác mà mã QR có thể hỗ trợ (tham khảo thêm tại đây).

Khi sử dụng Mobile Vision API, chúng ta có thể đọc mã vạch theo bất kỳ hướng nào. Quan trọng hơn, tất cả mã vạch đều được xử lý mà không cần tham chiếu dữ liệu từ bất kỳ nguồn bên ngoài nào.

2. Áp dụng tính năng quét mã vạch với Android

a. Cấu hình Build.gradle

Để có thể sử dụng Mobile Vision API, chúng ta cần thêm những dòng code sau và đồng bộ Gradle để cập nhật bản Google Play Services mới nhất.

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.0.0'
    compile 'com.google.android.gms:play-services:7.8+'
}

b. Xử lý logic

Chúng ta sẽ làm một ví dụ nhỏ để đọc dữ liệu mã vạch từ một tấm hình trong drawable. Đầu tiên, tạo một biến Bitmap:

Bitmap myBitmap = BitmapFactory.decodeResource(
                        getApplicationContext().getResources(), 
                        R.drawable.puppy);

Tiếp đến, chúng ta sẽ cài đặt bộ giải mã để xử lý mã vạch:

BarcodeDetector detector = 
    new BarcodeDetector.Builder(getApplicationContext())
                        .setBarcodeFormats(Barcode.DATA_MATRIX | Barcode.QR_CODE)
                        .build();
if(!detector.isOperational()){
   txtView.setText("Could not set up the detector!");
   return;
}

Sau đó, chúng ta sẽ tiến hành nhận dạng mã vạch:

Frame frame = new Frame.Builder().setBitmap(myBitmap).build();
SparseArray<Barcode> barcodes = detector.detect(frame);

Cuối cùng, chúng ta sẽ giải mã nội dung của mã vạch:

Barcode thisCode = barcodes.valueAt(0);
TextView txtView = (TextView) findViewById(R.id.txtContent);
txtView.setText(thisCode.rawValue);

3. Lời kết

Với những bước như trên, chúng ta đã có thể tạo ra một ứng dụng quét mã vạch đơn giản. Mobile Vision API còn hỗ trợ rất nhiều định dạng mã vạch khác nhau. Hy vọng với bài viết của mình, các bạn sẽ có thể một lựa chọn nữa khi ứng dụng tính năng quét mã vạch trên Android.