Android, How to read QR code in my application?

前端 未结 7 1953
耶瑟儿~
耶瑟儿~ 2020-11-29 16:11

In my application I need to read Qr code. I searched the net and found Zing codes however lots of developers had problem with using it and it seems it is buggy!

If i

相关标签:
7条回答
  • 2020-11-29 16:23

    Use a QR library like ZXing... I had very good experience with it, QrDroid is much buggier. If you must rely on an external reader, rely on a standard one like Google Goggles!

    0 讨论(0)
  • 2020-11-29 16:24

    Zxing is an excellent library to perform Qr code scanning and generation. The following implementation uses Zxing library to scan the QR code image Don't forget to add following dependency in the build.gradle

    implementation 'me.dm7.barcodescanner:zxing:1.9'
    

    Code scanner activity:

        public class QrCodeScanner extends AppCompatActivity implements ZXingScannerView.ResultHandler {
            private ZXingScannerView mScannerView;
    
            @Override
            public void onCreate(Bundle state) {
                super.onCreate(state);
                // Programmatically initialize the scanner view
                mScannerView = new ZXingScannerView(this);
                // Set the scanner view as the content view
                setContentView(mScannerView);
            }
    
            @Override
            public void onResume() {
                super.onResume();
                // Register ourselves as a handler for scan results.
                mScannerView.setResultHandler(this);
                // Start camera on resume
                mScannerView.startCamera();
            }
    
            @Override
            public void onPause() {
                super.onPause();
                // Stop camera on pause
                mScannerView.stopCamera();
            }
    
            @Override
            public void handleResult(Result rawResult) {
                // Do something with the result here
                // Prints scan results
                Logger.verbose("result", rawResult.getText());
                // Prints the scan format (qrcode, pdf417 etc.)
                Logger.verbose("result", rawResult.getBarcodeFormat().toString());
                //If you would like to resume scanning, call this method below:
                //mScannerView.resumeCameraPreview(this);
                Intent intent = new Intent();
                intent.putExtra(AppConstants.KEY_QR_CODE, rawResult.getText());
                setResult(RESULT_OK, intent);
                finish();
            }
        }
    
    0 讨论(0)
  • 2020-11-29 16:29

    In android studio, You can use bellow process to create & Read QR Code &image look like bellw

    1. Create a android studio empty project
    2. Add library in app.gradle

      compile 'com.google.zxing:core:3.2.1'
      compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
      
    3. In activity.main xml use bellow..

       <?xml version="1.0" encoding="utf-8"?>
       <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:app="http://schemas.android.com/apk/res-auto"
       xmlns:tools="http://schemas.android.com/tools"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       tools:context="com.example.enamul.qrcode.MainActivity">
      
      <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="20dp"
        android:orientation="vertical">
      
      
      <EditText
          android:id="@+id/editText"
          android:layout_width="fill_parent"
          android:layout_height="wrap_content"
          android:gravity="center"
          android:hint="Enter Text Here" />
      
      <Button
          android:id="@+id/button"
          android:layout_width="fill_parent"
          android:layout_height="50dp"
          android:layout_below="@+id/editText"
          android:text="Click Here TO generate qr code"
          android:textAllCaps="false"
          android:textSize="16sp" />
      
      
      <Button
          android:id="@+id/btnScan"
          android:layout_width="fill_parent"
          android:layout_height="50dp"
          android:layout_below="@+id/editText"
          android:text="Scan Your QR Code"
          android:textAllCaps="false"
          android:textSize="16sp" />
      
      <TextView
          android:id="@+id/tv_qr_readTxt"
          android:layout_width="match_parent"
          android:layout_height="wrap_content" />
      
      
      <ImageView
          android:id="@+id/imageView"
          android:layout_width="match_parent"
          android:layout_height="200dp"
          android:layout_below="@+id/button"
          android:src="@android:drawable/ic_dialog_email" />
      
      
      </LinearLayout>
      
      </LinearLayout>
      
    4. In MainActivity you can use bellow code

      public class MainActivity extends AppCompatActivity {
        ImageView imageView;
        Button button;
        Button btnScan;
        EditText editText;
        String EditTextValue ;
        Thread thread ;
        public final static int QRcodeWidth = 350 ;
        Bitmap bitmap ;
      
        TextView tv_qr_readTxt;
      
       @Override
       protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
      
          imageView = (ImageView)findViewById(R.id.imageView);
          editText = (EditText)findViewById(R.id.editText);
          button = (Button)findViewById(R.id.button);
          btnScan = (Button)findViewById(R.id.btnScan);
           tv_qr_readTxt = (TextView) findViewById(R.id.tv_qr_readTxt);
      
      button.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
      
      
      
              if(!editText.getText().toString().isEmpty()){
                  EditTextValue = editText.getText().toString();
      
                  try {
                      bitmap = TextToImageEncode(EditTextValue);
      
                      imageView.setImageBitmap(bitmap);
      
                  } catch (WriterException e) {
                      e.printStackTrace();
                  }
              }
              else{
                  editText.requestFocus();
                  Toast.makeText(MainActivity.this, "Please Enter Your Scanned Test" , Toast.LENGTH_LONG).show();
              }
      
            }
        });
      
      
      btnScan.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View view) {
      
              IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
              integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
              integrator.setPrompt("Scan");
              integrator.setCameraId(0);
              integrator.setBeepEnabled(false);
              integrator.setBarcodeImageEnabled(false);
              integrator.initiateScan();
      
           }
         });
          }
      
      
       Bitmap TextToImageEncode(String Value) throws WriterException {
         BitMatrix bitMatrix;
          try {
          bitMatrix = new MultiFormatWriter().encode(
                  Value,
                  BarcodeFormat.DATA_MATRIX.QR_CODE,
                  QRcodeWidth, QRcodeWidth, null
          );
      
          } catch (IllegalArgumentException Illegalargumentexception) {
      
           return null;
         }
        int bitMatrixWidth = bitMatrix.getWidth();
      
        int bitMatrixHeight = bitMatrix.getHeight();
      
        int[] pixels = new int[bitMatrixWidth * bitMatrixHeight];
      
        for (int y = 0; y < bitMatrixHeight; y++) {
            int offset = y * bitMatrixWidth;
      
           for (int x = 0; x < bitMatrixWidth; x++) {
      
               pixels[offset + x] = bitMatrix.get(x, y) ?
                      getResources().getColor(R.color.QRCodeBlackColor):getResources().getColor(R.color.QRCodeWhiteColor);
            }
          }
          Bitmap bitmap = Bitmap.createBitmap(bitMatrixWidth, bitMatrixHeight, Bitmap.Config.ARGB_4444);
      
         bitmap.setPixels(pixels, 0, 350, 0, 0, bitMatrixWidth, bitMatrixHeight);
         return bitmap;
      }
      
      
      
      
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
          IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
        if(result != null) {
          if(result.getContents() == null) {
              Log.e("Scan*******", "Cancelled scan");
      
           } else {
              Log.e("Scan", "Scanned");
      
              tv_qr_readTxt.setText(result.getContents());
              Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
           }
        } else {
            // This is important, otherwise the result will not be passed to the fragment
          super.onActivityResult(requestCode, resultCode, data);
           }
         }
       }
      
    5. You can download full source code from GitHub. GitHub link is : https://github.com/enamul95/QRCode

    0 讨论(0)
  • 2020-11-29 16:37

    if user doesn't have any qr reader, what will happen to the application? if it crashes, may i ask user to download for example QrDroid and after that use it?

    Interestingly, Google now introduced Mobile Vision APIs, they are integrated in play services itself.

    In your Gradle file just add:

    compile 'com.google.android.gms:play-services-vision:11.4.0'
    

    Taken from this QR code tutorial.

    UPDATE 2020:

    Now QR code scanning is also a part of ML Kit, so you can bundle the model inside the app and use it by integrating the following gradle dependency:

    dependencies {
      // ...
      // Use this dependency to bundle the model with your app
      implementation 'com.google.mlkit:barcode-scanning:16.0.3'
    }
    

    Or you can use the following gradle dependency to dynamically download the models from Google Play Services:

    dependencies {
      // ...
      // Use this dependency to use the dynamically downloaded model in Google Play Services
      implementation 'com.google.android.gms:play-services-mlkit-barcode-scanning:16.1.2'
    }
    

    Taken from this link.

    0 讨论(0)
  • 2020-11-29 16:38

    I've created a simple example tutorial. You can read this and use in your application.

    http://ribinsandroidhelper.blogspot.in/2013/03/qr-code-reading-on-your-application.html

    Through this link you can download the qrcode library project and import into your workspace and add library to your project

    and copy this code to your activity

     Intent intent = new Intent("com.google.zxing.client.android.SCAN");
     startActivityForResult(intent, 0);
    
     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");
                 Toast.makeText(this, contents,Toast.LENGTH_LONG).show();
                 // Handle successful scan
             } else if (resultCode == RESULT_CANCELED) {
                 //Handle cancel
             }
         }
    }
    
    0 讨论(0)
  • 2020-11-29 16:40
    try {
    
        Intent intent = new Intent("com.google.zxing.client.android.SCAN");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); // "PRODUCT_MODE for bar codes
    
        startActivityForResult(intent, 0);
    
    } catch (Exception e) {
    
        Uri marketUri = Uri.parse("market://details?id=com.google.zxing.client.android");
        Intent marketIntent = new Intent(Intent.ACTION_VIEW,marketUri);
        startActivity(marketIntent);
    
    }
    

    and in onActivityResult():

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {           
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 0) {
    
            if (resultCode == RESULT_OK) {
                String contents = data.getStringExtra("SCAN_RESULT");
            }
            if(resultCode == RESULT_CANCELED){
                //handle cancel
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题