web-dev-qa-db-de.com

Android, Wie lese ich QR-Code in meiner Anwendung?

In meiner Anwendung muss ich Qr-Code lesen. Ich suchte im Internet und fand Zing-Codes, aber viele Entwickler hatten Probleme damit und es scheint, dass es fehlerhaft ist!

Wenn ich davon ausgehe, dass bei meinen Kunden qr reader auf ihrem Gerät installiert ist, wie kann ich diese Anwendungen verwenden und sie mit impliziten Absichten aufrufen?

was passiert mit der Anwendung, wenn der Benutzer keinen QR-Reader hat? Wenn es abstürzt, darf ich den Benutzer bitten, zum Beispiel QrDroid herunterzuladen und es danach zu verwenden?

55
Hesam
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);

}

und 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
        }
    }
}
74
Seshu Vinay

Zxing ist eine hervorragende Bibliothek zum Scannen und Generieren von Qr-Code. In der folgenden Implementierung wird die Zxing-Bibliothek zum Scannen des QR-Codebilds verwendet. Vergessen Sie nicht, die folgende Abhängigkeit in build.gradle hinzuzufügen

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

Code Scanner Aktivität:

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();
    }
}
18
Amardeep

was passiert mit der Anwendung, wenn der Benutzer keinen QR-Reader hat? Wenn es abstürzt, darf ich den Benutzer bitten, zum Beispiel QrDroid herunterzuladen und es danach zu verwenden?

Interessanterweise hat Google jetzt Mobile Vision APIs eingeführt, sie sind in die Spieldienste selbst integriert.

Fügen Sie in Ihrer Gradle-Datei einfach Folgendes hinzu:

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

Aus diesem QR-Code-Tutorial .

17
KnowIT

In Android studio, können Sie den folgenden Prozess verwenden, um einen QR-Code zu erstellen und zu lesen & das Bild sieht aus wie eine Glocke enter image description here

  1. Erstellen Sie ein Android Studio leeres Projekt
  2. Bibliothek in app.gradle hinzufügen

    compile 'com.google.zxing:core:3.2.1'
    compile 'com.journeyapps:zxing-Android-embedded:[email protected]'
    
  3. In activity.main xml benutze unten ..

     <?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 können Sie folgenden Code verwenden

    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. Sie können den vollständigen Quellcode von GitHub herunterladen. Der GitHub-Link lautet: https://github.com/enamul95/QRCode

7
Enamul Haque

Ich habe ein einfaches Tutorial erstellt. Sie können dies lesen und in Ihrer Anwendung verwenden.

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

Über diesen Link können Sie das qrcode-Bibliotheksprojekt herunterladen und in Ihren Arbeitsbereich importieren und Ihrem Projekt eine Bibliothek hinzufügen

und kopieren Sie diesen Code in Ihre Aktivität

 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
         }
     }
}
6
Ribin Haridas

Verwenden Sie eine QR-Bibliothek wie ZXing ... Ich hatte sehr gute Erfahrungen damit, QrDroid ist viel fehlerhafter. Wenn Sie sich auf einen externen Leser verlassen müssen, verlassen Sie sich auf einen Standard wie Google Goggles!

2
ᆼᆺᆼ

Einfache QR-Code-Bibliothek

Eine einfache Android Easy QR Code Library. Es ist sehr einfach zu bedienen, um diese Bibliothek zu benutzen, folgen Sie diesen Schritten.

Für Gradle:

Schritt 1. Fügen Sie es am Ende der Repositorys in Ihr root build.gradle ein:

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

Schritt 2. Fügen Sie die Abhängigkeit hinzu:

dependencies {
        compile 'com.github.mrasif:easyqrlibrary:v1.0.0'
}

Für Maven:

Schritt 1. Fügen Sie das JitPack-Repository zu Ihrer Build-Datei hinzu:

<repositories>
    <repository>
        <id>jitpack.io</id>
        <url>https://jitpack.io</url>
    </repository>
</repositories>

Schritt 2. Fügen Sie die Abhängigkeit hinzu:

<dependency>
    <groupId>com.github.mrasif</groupId>
    <artifactId>easyqrlibrary</artifactId>
    <version>v1.0.0</version>
</dependency>

Für SBT:

Schritt 1. Fügen Sie das JitPack-Repository zu Ihrer build.sbt-Datei hinzu:

resolvers += "jitpack" at "https://jitpack.io"

Schritt 2. Fügen Sie die Abhängigkeit hinzu:

libraryDependencies += "com.github.mrasif" % "easyqrlibrary" % "v1.0.0"

Für Leiningen:

Schritt 1. Fügen Sie es am Ende der Repositorys in Ihre Datei project.clj ein:

:repositories [["jitpack" "https://jitpack.io"]]

Schritt 2. Fügen Sie die Abhängigkeit hinzu:

:dependencies [[com.github.mrasif/easyqrlibrary "v1.0.0"]]

Fügen Sie dies in Ihre Layout-XML-Datei ein:

<?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"
    Android:padding="20dp"
    tools:context=".MainActivity"
    Android:orientation="vertical">

    <TextView
        Android:id="@+id/tvData"
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content"
        Android:gravity="center"
        Android:text="No QR Data"/>
    <Button
        Android:id="@+id/btnQRScan"
        Android:layout_width="wrap_content"
        Android:layout_height="wrap_content"
        Android:text="QR Scan"/>

</LinearLayout>

Fügen Sie dies in Ihre Aktivitätsdateien Java ein:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{

    TextView tvData;
    Button btnQRScan;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        tvData=findViewById(R.id.tvData);
        btnQRScan=findViewById(R.id.btnQRScan);

        btnQRScan.setOnClickListener(this);
    }

    @Override
    public void onClick(View view){
        switch (view.getId()){
            case R.id.btnQRScan: {
                Intent intent=new Intent(MainActivity.this, QRScanner.class);
                startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);
            } break;
        }
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        switch (requestCode){
            case EasyQR.QR_SCANNER_REQUEST: {
                if (resultCode==RESULT_OK){
                    tvData.setText(data.getStringExtra(EasyQR.DATA));
                }
            } break;
        }
    }
}

Fügen Sie für einen benutzerdefinierten Scannerbildschirm diese Zeilen hinzu, wenn Sie die Scanneraktivität starten.

Intent intent=new Intent(MainActivity.this, QRScanner.class);
intent.putExtra(EasyQR.IS_TOOLBAR_SHOW,true);
intent.putExtra(EasyQR.TOOLBAR_DRAWABLE_ID,R.drawable.ic_audiotrack_dark);
intent.putExtra(EasyQR.TOOLBAR_TEXT,"My QR");
intent.putExtra(EasyQR.TOOLBAR_BACKGROUND_COLOR,"#0588EE");
intent.putExtra(EasyQR.TOOLBAR_TEXT_COLOR,"#FFFFFF");
intent.putExtra(EasyQR.BACKGROUND_COLOR,"#000000");
intent.putExtra(EasyQR.CAMERA_MARGIN_LEFT,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_TOP,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_RIGHT,50);
intent.putExtra(EasyQR.CAMERA_MARGIN_BOTTOM,50);
startActivityForResult(intent, EasyQR.QR_SCANNER_REQUEST);

Du bist fertig. Ref. Link: https://mrasif.github.io/easyqrlibrary