web-dev-qa-db-fra.com

Incorporer la bibliothèque Zxing sans utiliser l'application Barcode Scanner

Quel est le moyen préféré d’incorporer la bibliothèque zxing pour permettre la numérisation sans avoir à installer l’application Barcode Scanner? Je cherche à l'intégrer dans Android sans avoir à demander à l'utilisateur des installations supplémentaires. (Similaire au fonctionnement de l'iPhone src).

58
Joey Schluchter

Il est vraiment plus facile d'intégrer via Intent . Plus fiable, vous obtenez automatiquement les mises à jour. Bien que je ne le conseille pas ...

Le code source complet est disponible à partir du projet ZXing . Vous souhaitez créer core.jar à partir de core/ et le placer dans votre dossier Android lib/ pour inclure le décodeur principal dans votre application. Vous ne voulez pas inclure javase. Vous pouvez consulter le code dans Android/ car il s’agit de la source de Scanner de code à barres, mais en tant qu’auteurs, nous vous suggérons de ne pas simplement copier-coller.

Il est sous licence Apache , ce qui signifie que vous pouvez l’utiliser librement, à condition que vous donniez essentiellement à l’utilisateur l’accès aux conditions de licence.

59
Sean Owen

Android QR/Barcode/Multiformat Decoder.

J'ai créé une application Android à l'aide des API ZXing et intégré uniquement le code de décodage à mon application. L'entrée de ce décodeur a été donnée via la carte SD de l'émulateur Android.

Voici les étapes:

  1. Tout d'abord, j'ai créé un AVD (émulateur) version 4 dans mon Eclipse IDE avec les fonctions Carte SD et Appareil photo activées.

  2. Ensuite, j'ai créé une carte SD en utilisant les commandes ci-dessous dans l'invite de commande:

    c:\>mksdcard 40M mysdcard.iso
    

où 40M est la taille de la carte SD que j'ai créée. Elle sera enregistrée dans le lecteur C :. Notez que la partie .iso est importante.

  1. Ensuite, nous devons monter la carte SD dans l'émulateur en utilisant les commandes ci-dessous dans l'invite de commande:

     c:\>emulator -sdcard "c:\mysdcard.iso" @myavd4
    

Myavd4 correspond au nom du périphérique virtuel émulateur/Android créé à l’étape 1. Le signe "@" précédant le nom avd est également important.

Laissez l’émulateur en marche tout le temps. Si celui-ci est fermé, nous devons refaire les 3 étapes ci-dessus.

  1. Nous pouvons transmettre le code QR ou d'autres images de code que nous avons à cette carte SD montée sur notre émulateur en utilisant les commandes ci-dessous dans l'invite de commande:

    c:\>adb Push "c:\myqrcode.png" /sdcard
    
  2. Ensuite, dans l'EDI Eclipse, démarrez un nouveau projet Android. Le code ci-dessous doit être collé dans le fichier QRDecoder.Java de notre projet.

    package com.example.palani;
    import Android.app.Activity;
    import Android.content.Intent;
    import Android.graphics.Bitmap;
    import Android.graphics.BitmapFactory;
    import Android.net.Uri;
    import Android.os.Bundle;
    import Android.view.View;
    import Android.view.View.OnClickListener;
    import Android.widget.TextView;
    import com.google.zxing.BarcodeFormat;
    import com.google.zxing.BinaryBitmap;
    import com.google.zxing.ChecksumException;
    import com.google.zxing.FormatException;
    import com.google.zxing.LuminanceSource;
    import com.google.zxing.MultiFormatReader;
    import com.google.zxing.NotFoundException;
    import com.google.zxing.Reader;
    import com.google.zxing.Result;
    import com.google.zxing.ResultPoint;
    import com.google.zxing.client.androidtest.RGBLuminanceSource;
    import com.google.zxing.common.HybridBinarizer;
    public class QRDecoder extends Activity implements OnClickListener {
        public static class Global
        {
            public static String text=null;
        }
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.main);
            Bitmap bMap = BitmapFactory.decodeFile("/sdcard/myqrcode.png");
            TextView textv = (TextView) findViewById(R.id.mytext);
            View webbutton=findViewById(R.id.webbutton);
            LuminanceSource source = new RGBLuminanceSource(bMap); 
            BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
            Reader reader = new MultiFormatReader();
            try {
                 Result result = reader.decode(bitmap);
                 Global.text = result.getText(); 
                    byte[] rawBytes = result.getRawBytes(); 
                    BarcodeFormat format = result.getBarcodeFormat(); 
                    ResultPoint[] points = result.getResultPoints();
                    textv.setText(Global.text);
                    webbutton.setOnClickListener(this);
            } catch (NotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ChecksumException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (FormatException e) {
                // TODO Auto-generated catch block
        e.printStackTrace();
    
    
            }   
        }
    
        @Override
        public void onClick(View v) {
            Uri uri = Uri.parse(Global.text); 
            Intent intent = new Intent(Intent.ACTION_VIEW, uri); 
            startActivity(intent);
    
        }
    
    }
    
  3. Ensuite, j'ai téléchargé le code source ZXing (ZXing-1.6.Zip) à partir du lien ci-dessous.

    http://code.google.com/p/zxing/downloads/list
    

Ensuite, extrayez-le et accédez à D:\zxing-1.6\core\src\com

copiez le dossier com et collez-le dans notre package dans Eclipse.

(Remarque: cliquez avec le bouton droit sur le package de notre projet et collez-le ... s'il demande le remplacement du dossier existant, sélectionnez oui)

  1. Ensuite, copiez et collez le code ci-dessous dans le fichier res/layout/main.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
        Android:orientation="vertical"
        Android:layout_width="fill_parent"
        Android:layout_height="fill_parent"
        Android:padding="20dip"
        >
    
    <TextView
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    
    Android:textColor="@color/mbackground1"
    Android:gravity="center_horizontal"
    Android:text="@string/decode_label"
    Android:padding="20dip" 
    />
    
    <TextView
    Android:id="@+id/mytext"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:gravity="center_horizontal"
    Android:background="@color/mbackground2" 
    Android:textColor="@color/mytextcolor" 
    Android:padding="20dip"
    />
    
    
     <TextView
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="@string/continue_label"
    Android:gravity="center_horizontal"
    Android:textColor="@color/mytextcolor"
    Android:padding="20dip"
    />
    
    <Button 
    Android:id="@+id/webbutton"
    Android:layout_width="fill_parent"
    Android:layout_height="wrap_content"
    Android:text="@string/web_button"
    Android:textColor="@color/mytextcolor"
    />
    
    </LinearLayout>
    
  2. Ensuite, copiez et collez le code ci-dessous dans le fichier res/values ​​/ strings.xml

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <string name="hello">Hello World, QRDecoder!</string>
        <string name="app_name">QRDecoder</string>
        <string name="continue_label">Click below to load the URL!!</string>
        <string name="web_button">Load the URL!!</string>
        <string name="decode_label">Decoded URL</string>
    
    </resources>
    
  3. Ensuite, copiez et collez le code ci-dessous dans le fichier res/values ​​/ color.xml. S'il n'existe pas, créez-en un.

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <color name="mbackground1">#7cfc00</color>
    <color name="mbackground2">#ffff00</color>
    <color name="mytextcolor">#d2691e</color>
    </resources>
    
  4. Ensuite, copiez et collez le code ci-dessous dans le fichier manifeste après la balise d'ouverture. 

    <manifest>
    
    
    <uses-permission Android:name="Android.permission.INTERNET" />
      <uses-permission Android:name="Android.permission.WRITE_EXTERNAL_STORAGE" />
      <uses-permission Android:name="Android.permission.READ_EXTERNAL_STORAGE" />      
    
  5. Donc, ces étapes ci-dessus faites ... notre application est prête. Maintenant, vous pouvez exécuter l’application et cela vous donnera le résultat décodé de l’image d’entrée que nous avons donnée.

  6. Pour modifier l’entrée, insérez un autre fichier sur la carte SD en utilisant la commande ci-dessous dans la commande Invite.

    c:\>adb Push "c:\image2.png" /sdcard
    

et changez l'entrée dans notre QRDecoder.Java pour refléter la même chose

    Bitmap bMap = BitmapFactory.decodeFile("/sdcard/image.png");

les entrées peuvent être n’importe quel format comme QRCode, Code-barres, etc. Les types d’image peuvent être bmp, jpg ou png.

J'ai utilisé le site Web ci-dessous pour générer les codes QR à des fins de test

http://barcode.tec-it.com/

ET http://qrcode.kaywa.com

Merci et je voudrais mentionner le fait que je ne suis qu'un débutant dans le développement d'applications Android et mobiles et que je suis désolé pour les erreurs que j'aurais pu faire ...

29
Palani Babu

Maintenant vous pouvez utiliser l'API officielle des codes à barres de Google :

L'API de code à barres détecte les codes à barres en temps réel, sur l'appareil, dans n'importe quelle orientation. Il peut également détecter plusieurs codes à barres à la fois.

Il lit les formats de code à barres suivants:

  • Codes à barres 1D: EAN-13, EAN-8, UPC-A, UPC-E, Code-39, Code-93, Code-128, ITF, Codabar
  • Codes à barres 2D: QR Code, Data Matrix, PDF-417, AZTEC

Il analyse automatiquement les valeurs des codes QR, Data Matrix, PDF-417 et Aztec pour les formats pris en charge suivants:

  • URL
  • Coordonnées (VCARD, etc.)
  • Calendrier événement
  • Email
  • Téléphone
  • SMS
  • ISBN
  • Wifi
  • Géolocalisation (latitude et longitude)
  • Permis de conduire AAMVA/ID
4
FireZenk

Si vous suivez Palani, vous souhaitez uniquement importer zxing core. Voici comment vous pouvez utiliser RGBLuminanceSource sans importer zxing.androidtest .

// import com.google.zxing.client.androidtest.RGBLuminanceSource;
import com.google.zxing.RGBLuminanceSource;

// Bitmap mBitmap; // some bitmap...

int width = mBitmap.getWidth();
int height = mBitmap.getHeight();
int[] pixels = new int[width * height];
mBitmap.getPixels(pixels, 0, width, 0, 0, width, height);

RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);

BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(source));

try {
   Result result = zxingReader.decode(binaryBitmap);
} catch (Exception e) {
   e.printStackTrace();
}
4
Rui Marques

J'ai moi-même essayé cette méthode et surtout semblé fonctionner.

Bien que j'ai quelques points à faire 

  1. Il se plaindra du package com.google.zxing.client.androidtest nécessaire pour la classe RGBLuminanceSource trouvée dans le package et utilisé dans QRDecoder Activity.So Importer également le package zxing/androidtest.

  2. Si vous ajoutez la bibliothèque Zxing en dehors de votre paquet, vous devrez éditer toutes les références R.Java car il ne trouvera pas le fichier R.Java dans son paquet.

Par exemple:

Au lieu de

mRunBenchmarkButton = (Button) findViewById(R.id.benchmark_run);

dans l'utilisation du fichier BenchmarkActivity.Java

mRunBenchmarkButton = (Button) findViewById(yourpackage.R.id.benchmark_run);

Nous pouvons également utiliser l'interface DDMS d'Eclipse pour envoyer le code QR à la carte SD du périphérique.

Utilisation de DDMS

2
Sankalp

https://github.com/dm77/barcodescanner

J'ai préféré cette bibliothèque aux services Google Play car, comme d'habitude, Google Play Services requiert la même version que celle installée sur l'appareil. 

Il intègre Zxing avec le nouveau système de construction et fournit un aar. Vraiment cool.

0
tbruyelle