콘솔로 이동

Android에서 ML Kit를 사용하여 바코드 읽기

ML Kit를 사용하면 바코드를 인식하고 이를 디코딩할 수 있습니다.

시작하기 전에

  1. Firebase 프로젝트를 설정합니다.
    1. Firebase 프로젝트가 없으면 Firebase 콘솔에서 프로젝트를 만듭니다. 모바일 앱에 연결된 기존 Google 프로젝트가 있으면 Google 프로젝트 가져오기를 클릭합니다. 기존 프로젝트가 없으면 프로젝트 추가를 클릭합니다.
    2. Android 앱에 Firebase 추가를 클릭하고 설정 단계를 따릅니다. 기존 Google 프로젝트를 가져오는 경우 이 단계가 자동으로 수행될 수 있으며 구성 파일만 다운로드하면 됩니다.
    3. 메시지가 표시되면 앱의 패키지 이름을 입력합니다. 앱에서 사용하고 있는 패키지 이름을 입력해야 합니다. 이 설정은 Firebase 프로젝트에 앱을 추가할 때만 가능합니다.
    4. 마지막으로 google-services.json 파일을 다운로드합니다. 언제든지 다시 구성 파일을 다운로드할 수 있습니다.
    5. 이 파일을 프로젝트의 모듈 폴더(일반적으로 app/)에 복사하여 붙여넣기합니다.
  2. EAP 담당자에게서 받은 SDK의 압축을 풉니다.
    unzip -d $SDK_DIR 3p_sdk.m2repo.zip
    
  3. SDK의 압축을 푼 디렉토리와 google-services 플러그인을 프로젝트 수준의 build.gradle에 추가합니다.
    buildscript {
      // ...
      dependencies {
          // ...
          classpath 'com.google.gms:google-services:3.2.0' // google-services plugin
      }
    }
    
    allprojects {
      repositories {
        // Add this
        maven {
          url "$SDK_DIR"
        }
        // This should already be here
        jcenter()
    
        ...
      }
    }
    
  4. 그런 다음 ML Kit 종속 항목을 포함하고 apply plugin 행을 앱 수준 build.gradle 파일에 추가합니다.

    dependencies {
      // ...
      compile 'com.google.firebase:firebase-core:12.8.0-SNAPSHOT'
      compile 'com.google.firebase:firebase-ml-vision:12.8.0-SNAPSHOT'
    }
    
    // ADD THIS AT THE BOTTOM OF THE FILE
    apply plugin: 'com.google.gms.google-services'
    

바코드 감지기 구성

읽으려는 바코드 형식을 알고 있는 경우, 해당 형식만 감지하도록 구성하여 바코드 감지기의 속도를 높일 수 있습니다.

예를 들어 Aztec 코드와 QR 코드만 감지하려면 FirebaseVisionBarcodeDetectorOptions 객체를 다음과 같이 빌드합니다.

FirebaseVisionBarcodeDetectorOptions options =
    new FirebaseVisionBarcodeDetectorOptions.Builder()
        .setBarcodeFormats(FirebaseVisionBarcode.FORMAT_QR_CODE,
                           FirebaseVisionBarcode.FORMAT_AZTEC)
        .build();

지원되는 형식은 다음과 같습니다.

  • Code 128(FORMAT_CODE_128)
  • Code 39(FORMAT_CODE_39)
  • Code 93(FORMAT_CODE_93)
  • Codabar(FORMAT_CODABAR)
  • EAN-13(FORMAT_EAN_13)
  • EAN-8(FORMAT_EAN_8)
  • ITF(FORMAT_ITF)
  • UPC-A(FORMAT_UPC_A)
  • UPC-E(FORMAT_UPC_E)
  • Data Matrix(FORMAT_DATA_MATRIX)
  • QR Code(FORMAT_QR_CODE)
  • PDF417(FORMAT_PDF417)
  • Aztec(FORMAT_AZTEC)

바코드 감지기 실행

이미지 속 바코드를 인식하려면 이미지를 ByteBuffer 객체로 FirebaseVisionBarcodeDetectordetectInBuffer 메소드에 전달하거나 이미지를 android.graphics.Bitmap 객체로 detectInImage 메소드에 전달합니다.

  1. FirebaseVisionBarcodeDetector의 인스턴스를 가져옵니다.

    FirebaseVisionBarcodeDetector detector = FirebaseVision.getInstance()
        .getVisionBarcodeDetector(options);
    
  2. 이미지의 메타데이터가 포함된 FirebaseVisionImageMetadata 객체를 만듭니다.

    이미지를 ByteBuffer로 전달하는 경우 이미지의 높이, 너비, 색상 인코딩 형식, 방향을 지정해야 합니다.

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setWidth(1280)
        .setHeight(720)
        .setFormat(FirebaseVisionImageMetadata.IMAGE_FORMAT_NV21)
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    

    이미지를 Bitmap으로 전달하는 경우에는 이미지의 방향만 지정하면 됩니다.

    FirebaseVisionImageMetadata metadata = new FirebaseVisionImageMetadata.Builder()
        .setRotation(FirebaseVisionImageMetadata.ROTATION_0)
        .build();
    
  3. 마지막으로 이미지를 detectInBuffer 또는 detectInImage 메소드에 전달합니다.

    Task<SparseArray<FirebaseVisionBarcode>> result =
        detector.detectInImage(image, metadata)  // or detectInBuffer(buffer, metadata)
        .addOnSuccessListener(
            this,
            new OnSuccessListener<SparseArray<FirebaseVisionBarcode>>() {
              @Override
              public void onSuccess(SparseArray<FirebaseVisionBarcode> barcodes) {
                // Task completed successfully
                // ...
              }
            })
        .addOnFailureListener(
            this,
            new OnFailureListener() {
              @Override
              public void onFailure(@NonNull Exception e) {
                // Task failed with an exception
                // ...
              }
            });
    

바코드에서 정보 가져오기

바코드 인식 작업이 성공하면 FirebaseVisionBarcode 객체의 배열이 성공 리스너에 전달됩니다. 각 FirebaseVisionBarcode 객체는 이미지에서 감지된 바코드를 나타냅니다. 바코드별로 입력 이미지의 경계 좌표 및 바코드로 인코딩된 원시 데이터를 가져올 수 있습니다. 또한 바코드 감지기가 바코드로 인코딩된 데이터 유형을 결정할 수 있는 경우, 파싱된 데이터가 포함된 객체를 가져올 수 있습니다.

예:

for(int i = 0; i < barcodes.size(); i++) {
  FirebaseVisionBarcode barcode = barcodes.valueAt(i);

  Rect bounds = barcode.getBoundingBox();
  Point[] corners = barcode.getCornerPoints();

  String rawValue = barcode.getRawValue();

  int valueType = barcode.getValueType();
  // See API reference for complete list of supported types
  switch (valueType) {
    case FirebaseVisionBarcode.TYPE_WIFI:
      String ssid = barcode.getWifi().getSsid();
      String password = barcode.getWifi().getPassword();
      int type = barcode.getWifi().getEncryptionType();
      break;
    case FirebaseVisionBarcode.TYPE_URL:
      String title = barcode.getUrl().getTitle();
      String url = barcode.getUrl().getUrl();
      break;
  }
}