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


72

In meiner Bewerbung muss ich Qr-Code lesen. Ich habe im Internet gesucht und Zing-Codes gefunden, 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 über implizite Absichten aufrufen?

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

Antworten:


83
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
        }
    }
}

Kleiner Tippfehler: Sie haben ein zusätzliches L zu "storniert"

9
@ SheshuVinay, aber dafür benötigen wir die BARCODE SCANNER App im Telefon installiert
Sagar Devanga

@SeshuVinay können Sie mir sagen, wie Daten nach dem Scannen gespeichert werden.
Abhishek

26

Zxing ist eine hervorragende Bibliothek zum Scannen und Generieren von Qr-Code. Die folgende Implementierung verwendet die Zxing-Bibliothek zum Scannen des QR-Code-Bildes. Vergessen Sie nicht, die folgende Abhängigkeit im build.gradle hinzuzufügen

implementation '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();
        }
    }

5
Dieser Code ist in der Anwendung, dies sollte die akzeptierte Antwort sein
matheszabi

3
Wenn Sie einen weißen Bildschirm erhalten, versuchen Sie es im Abschnitt <manifest> Ihrer AndroidManifest.xml, wie unter github.com/dm77/barcodescanner beschrieben .
Jorgen

Nur ein informatives Update. Bitte verfolgen Sie auch das Update der Versionsnummer der Bibliothek.
Amardeep

AppConstants.KEY_QR_CODE - "AppConstants" ist ungelöst
Andrew Snejovski

@AndrewSnejovski AppConstants.KEY_QR_CODE ist nur eine Konstante, die in einer konstanten Datei verwaltet wird. Sie können Ihre eigenen definieren. Es wird als Schlüssel verwendet, um die Ergebnisdaten an die aufrufende Aktivität zurückzusenden. Dabei werden die erforderlichen Daten in onActivityResult auf der Grundlage dieses Schlüssels abgerufen.
Amardeep

26

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

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

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

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

Entnommen aus diesem QR-Code-Tutorial .

UPDATE 2020:

Jetzt ist das Scannen von QR-Codes auch Teil von ML Kit, sodass Sie das Modell in der App bündeln und verwenden können, indem Sie die folgende Gradle-Abhängigkeit integrieren:

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

Sie können auch die folgende Gradle-Abhängigkeit verwenden, um die Modelle dynamisch von Google Play Services herunterzuladen:

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'
}

Aus diesem Link entnommen .


2
Dies erfordert die Installation von Google Services auf dem Zielgerät, über das nicht alle Telefone verfügen.
Leo unterstützt Monica Cellio

@LeonardoAcevedo Google Play Services haben eine sehr hohe Akzeptanzrate, dh 90% +. Auch seit der Veröffentlichung dieser Funktion ist es eine Weile her. Sollte also jetzt überhaupt kein Problem sein.
KnowIT

4
Ich bezweifle, dass die Einführung von Play Services so weit verbreitet sein kann, dass China ihre Nutzung verbietet, aber auf jeden Fall ist dies kein integraler Bestandteil von Android und sollte nicht als solcher betrachtet werden
Leo unterstützt Monica Cellio am

15

In Android Studio können Sie den folgenden Prozess verwenden, um QR-Code zu erstellen und zu lesen. Das Bild sieht aus wie eine Glocke Geben Sie hier die Bildbeschreibung ein

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

    compile 'com.google.zxing:core:3.2.1'
    compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
    
  3. Verwenden Sie in activity.main xml 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


Vielen Dank! Ich musste SDK 26 installieren, um Ihr Projekt zu erstellen. Funktioniert gut. Außerdem wurden die Versionen der Bibliotheken auf "com.google.zxing: core: 3.3.3" und "com.journeyapps: zxing-android-embedded: 3.6.0@aar" aktualisiert. Wie kann Ihre Rate 1 sein, wenn Sie viele positive Antworten haben?
CoolMind

Nach dem Scannen geht es zurück zur Startseite. Ich benutze diesen Code in Fragmenten!
SagitSri

6

Ich habe ein einfaches Beispiel-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, 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
         }
     }
}

Hallo, kannst du deine Antwort erweitern? Near-Link-Only-Antworten sind nicht hilfreich, wenn der Link jemals unterbrochen wird.
Orique

Hallo, meine Antwort ist bearbeitet. Sie können dies durchgehen und Sie sollten den URL-Link in der Antwort
suchen

Es heißt, die Datei sei veraltet
Eenvincible

2

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!


1

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 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äts-Java-Dateien 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ür einen benutzerdefinierten Scannerbildschirm fügen Sie einfach 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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.