How to scan QRCode in android

前端 未结 7 2299
说谎
说谎 2020-12-25 14:04

I found a tutorial on how to scan a barcode. But in my application I have to scan a QR code. How can I a scan QR code in Android?

7条回答
  •  轻奢々
    轻奢々 (楼主)
    2020-12-25 14:52

    My way is to use barcodescanner. I uses zxing for scanning bar codes and QR codes. The version 1.9 of the library utilises zxing v3.2.1. It's a wrapper for zxing so the usage is simplier.

    In order to do this:

    1. Add dependency to gradle

      compile 'me.dm7.barcodescanner:zxing:1.9'
      
    2. Add camera permission to manifest

      
      
    3. Create activity, that will handle scanning

      Manifest:

      
      

      styles.xml:

      
      

      Create scanner activity:

      import android.app.Activity;
      import android.content.Intent;
      import android.os.Bundle;
      import android.util.Log;
      import android.view.WindowManager;
      
      import com.google.zxing.BarcodeFormat;
      import com.google.zxing.Result;
      
      import java.util.ArrayList;
      import java.util.Collection;
      import java.util.List;
      
      import me.dm7.barcodescanner.zxing.ZXingScannerView;
      
      public class ScannerActivity extends Activity implements ZXingScannerView.ResultHandler {
      
          public static final String EXCLUDED_FORMAT = "ExcludedFormat";
          private static final String TAG = ScannerActivity.class.getSimpleName();
          private ZXingScannerView mScannerView;
      
          @Override
          public void onCreate(Bundle state) {
              setStatusBarTranslucent(true);
              super.onCreate(state);
              mScannerView = new ZXingScannerView(this);
              setContentView(mScannerView);
          }
      
          protected void setStatusBarTranslucent(boolean makeTranslucent) {
              if (makeTranslucent) {
                  getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
              } else {
                  getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
              }
          }
      
          @Override
          public void onResume() {
              super.onResume();
              mScannerView.setResultHandler(this);
              mScannerView.startCamera();
          }
      
          @Override
          public void onPause() {
              super.onPause();
              mScannerView.stopCamera();
          }
      
          @Override
          public void handleResult(Result rawResult) {
              String result = rawResult.getText();
              BarcodeFormat format = rawResult.getBarcodeFormat();
      
              Log.v(TAG, "Scanned code: " + rawResult.getText());
              Log.v(TAG, "Scanend code type: " + rawResult.getBarcodeFormat().toString());
      
              //Return error
              if (result == null) {
                  setResult(RESULT_CANCELED, returnErrorCode(result, format));
                  finish();
              }
      
              if (result.isEmpty()) {
                  setResult(RESULT_CANCELED, returnErrorCode(result, format));
                  finish();
              }
      
              //Return correct code
              setResult(RESULT_OK, returnCorrectCode(result, format));
              finish();
          }
      
          private Intent returnErrorCode(String result, BarcodeFormat format) {
              Intent returnIntent = new Intent();
              returnIntent.putExtra(ScannerConstants.ERROR_INFO, getResources().getString(R.string.scanner_error_message));
              return returnIntent;
          }
      
          private Intent returnCorrectCode(String result, BarcodeFormat format) {
              Intent returnIntent = new Intent();
              returnIntent.putExtra(ScannerConstants.SCAN_RESULT, result);
      
              if (format.equals(BarcodeFormat.QR_CODE)) {
                  returnIntent.putExtra(ScannerConstants.SCAN_RESULT_TYPE, ScannerConstants.QR_SCAN);
              } else {
                  returnIntent.putExtra(ScannerConstants.SCAN_RESULT_TYPE, ScannerConstants.BAR_SCAN);
              }
      
              return returnIntent;
          }
      
          public void excludeFormats(BarcodeFormat item) {
              Collection defaultFormats = mScannerView.getFormats();
              List formats = new ArrayList<>();
              for (BarcodeFormat format : defaultFormats) {
                  if (!format.equals(item)) {
                      formats.add(format);
                  }
              }
              mScannerView.setFormats(formats);
          }
      
          public interface ScannerConstants {
              public static final String SCAN_MODES = "SCAN_MODES";
              public static final String SCAN_RESULT = "SCAN_RESULT";
              public static final String SCAN_RESULT_TYPE = "SCAN_RESULT_TYPE";
              public static final String ERROR_INFO = "ERROR_INFO";
              public static final int BAR_SCAN = 0;
              public static final int QR_SCAN = 1;
          }
      }
      

      Just be sure, that on API 23+ devices a permission for camera usage is granted for the application.

      Open the Activity just like the normal one with result expectation:

      Intent intent = new Intent(AddEquipmentActivity.this, ScannerActivity.class);
      startActivityForResult(intent, SCAN_SERIAL_REQUEST);
      

提交回复
热议问题