web-dev-qa-db-fra.com

Android, Comment lire le code QR dans mon application?

Dans mon application, je dois lire le code Qr. J'ai cherché sur Internet et trouvé des codes Zing, mais beaucoup de développeurs ont eu du mal à l'utiliser et il semble que ce soit un buggy!

Si je suppose que qr reader est installé sur mes appareils, comment puis-je utiliser ces applications et les appeler via des intentions implicites?

si l'utilisateur n'a pas de lecteur QR, qu'adviendra-t-il de l'application? S'il se bloque, puis-je demander à l'utilisateur de télécharger par exemple QrDroid et de l'utiliser ensuite?

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

}

et dans 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 est une excellente bibliothèque pour scanner et générer du code Qr. L’implémentation suivante utilise la bibliothèque Zxing pour analyser l’image de code QR. Ne pas oublier d’ajouter la dépendance suivante dans le fichier build.gradle.

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

Activité du scanner de code:

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

si l'utilisateur n'a pas de lecteur QR, qu'adviendra-t-il de l'application? S'il se bloque, puis-je demander à l'utilisateur de télécharger par exemple QrDroid et de l'utiliser ensuite?

Fait intéressant, Google a maintenant introduit API Mobile Vision , elles sont intégrées aux services de jeu eux-mêmes.

Dans votre fichier Gradle, ajoutez simplement:

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

Tiré de ceci tutoriel de code QR .

17
KnowIT

Dans Android studio, vous pouvez utiliser le processus ci-dessous pour créer & lire un code QR & une image ressemblant à un bellw enter image description here

  1. Créez un projet vide Android studio
  2. Ajouter une bibliothèque dans app.gradle

    compile 'com.google.zxing:core:3.2.1'
    compile 'com.journeyapps:zxing-Android-embedded:3.2.0@aar'
    
  3. Dans activity.main, utilisez ci-dessous.

     <?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. Dans MainActivity, vous pouvez utiliser le code ci-dessous.

    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. Vous pouvez télécharger le code source complet depuis GitHub. Le lien GitHub est: https://github.com/enamul95/QRCode

7
Enamul Haque

J'ai créé un exemple de tutoriel simple. Vous pouvez lire ceci et l'utiliser dans votre application.

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

Grâce à ce lien, vous pouvez télécharger le projet de bibliothèque qrcode, l'importer dans votre espace de travail et l'ajouter à votre projet.

et copiez ce code dans votre activité

 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

Utilisez une bibliothèque QR comme ZXing ... J'ai eu une très bonne expérience, QrDroid est beaucoup plus buggier. Si vous devez utiliser un lecteur externe, utilisez un lecteur standard tel que Google Goggles!

2
ᆼᆺᆼ

Bibliothèque de codes QR facile

Un simple Android Bibliothèque de codes QR facile. Il est très facile à utiliser. Pour utiliser cette bibliothèque, suivez ces étapes.

Pour Gradle:

Étape 1. Ajoutez-le dans votre build.gradle racine à la fin des référentiels:

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

Étape 2. Ajoutez la dépendance:

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

Pour Maven:

Étape 1. Ajoutez le référentiel JitPack à votre fichier de construction:

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

Étape 2. Ajoutez la dépendance:

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

Pour SBT:

Étape 1. Ajoutez le référentiel JitPack à votre fichier build.sbt:

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

Étape 2. Ajoutez la dépendance:

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

Pour Leiningen:

Étape 1. Ajoutez-le dans votre projet.clj à la fin des référentiels:

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

Étape 2. Ajoutez la dépendance:

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

Ajoutez ceci dans votre fichier XML de mise en page:

<?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>

Ajoutez ceci à votre activité Java:

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

Pour un écran de scanner personnalisé, ajoutez simplement ces lignes lorsque vous démarrez l’activité du scanner.

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

Vous avez terminé. Réf. Lien: https://mrasif.github.io/easyqrlibrary

0