web-dev-qa-db-fra.com

Intégration de la bibliothèque ZXing directement dans mon application Android

J'écris ceci en simple désespoir :) On m'a confié la tâche de créer un lecteur de codes à barres autonome (en guise de preuve de concept) sur un téléphone Android 1.6.

Pour cela, j'ai découvert la bibliothèque ZXing.

J'ai googlé, lu des sujets liés ici sur StackOverflow utilisé sens commun et ainsi de suite. Rien ne semblait avoir aidé, et je ne peux tout simplement pas percer un trou dans ce blocus mental: /

Je sais qu'il est possible d'utiliser la bibliothèque et de créer votre propre lecteur de codes à barres autonome. J'ai lu que l'utilisation du "scanner de codes à barres" fourni par les gens de Zxing est de loin la solution la plus simple (via Intent). Malheureusement, ce n'est pas une option, et une application autonome est souhaitée.

Donc pour résumer mon problème:

  1. Comment intégrer la bibliothèque source de ZXing dans mon projet de code Android via Eclipse?
  2. Une fois intégré ... comment utiliser la lib, pour "charger" la fonction de numérisation?
  3. Un guide étape par étape est presque préférable car je viens de commencer à travailler dans Eclipse.

J'ai essayé de rendre mon projet de code dépendant du dossier Android du dossier source de ZXing. Lorsque je le fais, des erreurs commises par la suite se produisent, concernant principalement 'org.Apache' (??)

Je n'arrive pas à comprendre ... alors quelques conseils seraient très utiles.

D'avance, merci :)

137
AppDev

UPDATE! - RESOLU + GUIDE

J'ai réussi à comprendre :) Et ci-dessous, vous pouvez lire le guide étape par étape pour pouvoir aider les autres avec le même problème que moi;)

  1. Installer Apache Ant --- (Voir cette vidéo sur YouTube pour obtenir de l'aide sur la configuration )
  2. Téléchargez le code source de ZXing à partir de ZXing et extrayez-le
  3. Avec l’utilisation de Windows Commandline (Run-> CMD), accédez au répertoire racine du fichier zxing src téléchargé.
  4. Dans la fenêtre de la ligne de commande - Tapez ant -f core/build.xml appuyez sur Entrée et laissez Apache travailler, c'est magique [avoir des problèmes?]
  5. Entrez Eclipse -> new Android Project, en fonction du dossier Android du répertoire que vous venez d'extraire.
  6. Cliquez avec le bouton droit sur le dossier du projet -> Propriétés -> Java Chemin de construction -> Bibliothèque -> Ajouter des fichiers JAR externes ...
  7. Naviguez jusqu'au nouveau dossier extrait, ouvrez le répertoire principal et sélectionnez core.jar ... appuyez sur Entrée!

Maintenant, il ne vous reste plus qu'à corriger quelques erreurs dans les traductions et le fichier AndroidManifest.xml :) Vous pouvez maintenant compiler avec bonheur et disposer désormais d'une application autonome de scanner de codes à barres, basée sur la source ZXing;)

Heureux codage les gars - J'espère que cela peut aider les autres :)

125
AppDev

Voici un guide étape par étape sur la manière de générer et d'afficher un code QR à l'aide de la bibliothèque ZXing sans avoir à installer l'application tierce. Remarque: vous ne devez pas créer de ZXing avec ANT ou tout autre outil de construction. Le fichier core.jar est disponible dans l'archive Zip publiée (voir ci-dessous).

  1. Téléchargez le dernière version de ZXing . - (ZXing-*.Zip)
  2. Extrayez cette archive Zip et recherchez core.jar dans le répertoire core/.
  3. Si vous utilisez Eclipse IDE, faites glisser core.jar dans le répertoire libs de votre projet Android. Lorsque vous y êtes invité, sélectionnez Copier .
  4. Copiez les deux classes données ci-dessous (Contents.Java & QRCodeEncoder.Java) dans le package principal de votre projet Android.
  5. Créez un élément ImageView dans votre activité pour afficher le code QR généré, si vous n'en avez pas déjà. Un exemple est donné ci-dessous:
  6. Utilisez l'extrait de code ci-dessous pour générer le code QR au format Bitmap et l'afficher dans un fichier ImageView.

Voici un élément ImageView à ajouter à votre fichier XML de mise en forme d'activité:

<ImageView 
    Android:id="@+id/qrCode"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginTop="50dp"
    Android:layout_centerHorizontal="true"/>

Extrait de code:

// ImageView to display the QR code in.  This should be defined in 
// your Activity's XML layout file
ImageView imageView = (ImageView) findViewById(R.id.qrCode);

String qrData = "Data I want to encode in QR code";
int qrCodeDimention = 500;

QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(qrData, null,
        Contents.Type.TEXT, BarcodeFormat.QR_CODE.toString(), qrCodeDimention);

try {
    Bitmap bitmap = qrCodeEncoder.encodeAsBitmap();
    imageView.setImageBitmap(bitmap);
} catch (WriterException e) {
    e.printStackTrace();
}

Voici Contents.Java

//
// * Copyright (C) 2008 ZXing authors
// * 
// * Licensed under the Apache License, Version 2.0 (the "License");
// * you may not use this file except in compliance with the License.
// * You may obtain a copy of the License at
// * 
// * http://www.Apache.org/licenses/LICENSE-2.0
// * 
// * Unless required by applicable law or agreed to in writing, software
// * distributed under the License is distributed on an "AS IS" BASIS,
// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// * See the License for the specific language governing permissions and
// * limitations under the License.
// 

import Android.provider.ContactsContract;

public final class Contents {
    private Contents() {
    }

    public static final class Type {

     // Plain text. Use Intent.putExtra(DATA, string). This can be used for URLs too, but string
     // must include "http://" or "https://".
        public static final String TEXT = "TEXT_TYPE";

        // An email type. Use Intent.putExtra(DATA, string) where string is the email address.
        public static final String EMAIL = "EMAIL_TYPE";

        // Use Intent.putExtra(DATA, string) where string is the phone number to call.
        public static final String PHONE = "PHONE_TYPE";

        // An SMS type. Use Intent.putExtra(DATA, string) where string is the number to SMS.
        public static final String SMS = "SMS_TYPE";

        public static final String CONTACT = "CONTACT_TYPE";

        public static final String LOCATION = "LOCATION_TYPE";

        private Type() {
        }
    }

    public static final String URL_KEY = "URL_KEY";

    public static final String NOTE_KEY = "NOTE_KEY";

    // When using Type.CONTACT, these arrays provide the keys for adding or retrieving multiple phone numbers and addresses.
    public static final String[] PHONE_KEYS = {
            ContactsContract.Intents.Insert.PHONE, ContactsContract.Intents.Insert.SECONDARY_PHONE,
            ContactsContract.Intents.Insert.TERTIARY_PHONE
    };

    public static final String[] PHONE_TYPE_KEYS = {
            ContactsContract.Intents.Insert.PHONE_TYPE,
            ContactsContract.Intents.Insert.SECONDARY_PHONE_TYPE,
            ContactsContract.Intents.Insert.TERTIARY_PHONE_TYPE
    };

    public static final String[] EMAIL_KEYS = {
            ContactsContract.Intents.Insert.EMAIL, ContactsContract.Intents.Insert.SECONDARY_EMAIL,
            ContactsContract.Intents.Insert.TERTIARY_EMAIL
    };

    public static final String[] EMAIL_TYPE_KEYS = {
            ContactsContract.Intents.Insert.EMAIL_TYPE,
            ContactsContract.Intents.Insert.SECONDARY_EMAIL_TYPE,
            ContactsContract.Intents.Insert.TERTIARY_EMAIL_TYPE
    };
}

Et QRCodeEncoder.Java

/*
 * Copyright (C) 2008 ZXing authors
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 * http://www.Apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import Android.provider.ContactsContract;
import Android.graphics.Bitmap;
import Android.os.Bundle;
import Android.telephony.PhoneNumberUtils;

import Java.util.Collection;
import Java.util.EnumMap;
import Java.util.HashSet;
import Java.util.Map;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.EncodeHintType;
import com.google.zxing.MultiFormatWriter;
import com.google.zxing.WriterException;
import com.google.zxing.common.BitMatrix;

public final class QRCodeEncoder {
    private static final int WHITE = 0xFFFFFFFF;
    private static final int BLACK = 0xFF000000;

    private int dimension = Integer.MIN_VALUE;
    private String contents = null;
    private String displayContents = null;
    private String title = null;
    private BarcodeFormat format = null;
    private boolean encoded = false;

    public QRCodeEncoder(String data, Bundle bundle, String type, String format, int dimension) {
        this.dimension = dimension;
        encoded = encodeContents(data, bundle, type, format);
    }

    public String getContents() {
        return contents;
    }

    public String getDisplayContents() {
        return displayContents;
    }

    public String getTitle() {
        return title;
    }

    private boolean encodeContents(String data, Bundle bundle, String type, String formatString) {
        // Default to QR_CODE if no format given.
        format = null;
        if (formatString != null) {
            try {
                format = BarcodeFormat.valueOf(formatString);
            } catch (IllegalArgumentException iae) {
                // Ignore it then
            }
        }
        if (format == null || format == BarcodeFormat.QR_CODE) {
            this.format = BarcodeFormat.QR_CODE;
            encodeQRCodeContents(data, bundle, type);
        } else if (data != null && data.length() > 0) {
            contents = data;
            displayContents = data;
            title = "Text";
        }
        return contents != null && contents.length() > 0;
    }

    private void encodeQRCodeContents(String data, Bundle bundle, String type) {
        if (type.equals(Contents.Type.TEXT)) {
            if (data != null && data.length() > 0) {
                contents = data;
                displayContents = data;
                title = "Text";
            }
        } else if (type.equals(Contents.Type.EMAIL)) {
            data = trim(data);
            if (data != null) {
                contents = "mailto:" + data;
                displayContents = data;
                title = "E-Mail";
            }
        } else if (type.equals(Contents.Type.PHONE)) {
            data = trim(data);
            if (data != null) {
                contents = "tel:" + data;
                displayContents = PhoneNumberUtils.formatNumber(data);
                title = "Phone";
            }
        } else if (type.equals(Contents.Type.SMS)) {
            data = trim(data);
            if (data != null) {
                contents = "sms:" + data;
                displayContents = PhoneNumberUtils.formatNumber(data);
                title = "SMS";
            }
        } else if (type.equals(Contents.Type.CONTACT)) {
            if (bundle != null) {
                StringBuilder newContents = new StringBuilder(100);
                StringBuilder newDisplayContents = new StringBuilder(100);

                newContents.append("MECARD:");

                String name = trim(bundle.getString(ContactsContract.Intents.Insert.NAME));
                if (name != null) {
                    newContents.append("N:").append(escapeMECARD(name)).append(';');
                    newDisplayContents.append(name);
                }

                String address = trim(bundle.getString(ContactsContract.Intents.Insert.POSTAL));
                if (address != null) {
                    newContents.append("ADR:").append(escapeMECARD(address)).append(';');
                    newDisplayContents.append('\n').append(address);
                }

                Collection<String> uniquePhones = new HashSet<String>(Contents.PHONE_KEYS.length);
                for (int x = 0; x < Contents.PHONE_KEYS.length; x++) {
                    String phone = trim(bundle.getString(Contents.PHONE_KEYS[x]));
                    if (phone != null) {
                        uniquePhones.add(phone);
                    }
                }
                for (String phone : uniquePhones) {
                    newContents.append("TEL:").append(escapeMECARD(phone)).append(';');
                    newDisplayContents.append('\n').append(PhoneNumberUtils.formatNumber(phone));
                }

                Collection<String> uniqueEmails = new HashSet<String>(Contents.EMAIL_KEYS.length);
                for (int x = 0; x < Contents.EMAIL_KEYS.length; x++) {
                    String email = trim(bundle.getString(Contents.EMAIL_KEYS[x]));
                    if (email != null) {
                        uniqueEmails.add(email);
                    }
                }
                for (String email : uniqueEmails) {
                    newContents.append("EMAIL:").append(escapeMECARD(email)).append(';');
                    newDisplayContents.append('\n').append(email);
                }

                String url = trim(bundle.getString(Contents.URL_KEY));
                if (url != null) {
                    // escapeMECARD(url) -> wrong escape e.g. http\://zxing.google.com
                    newContents.append("URL:").append(url).append(';');
                    newDisplayContents.append('\n').append(url);
                }

                String note = trim(bundle.getString(Contents.NOTE_KEY));
                if (note != null) {
                    newContents.append("NOTE:").append(escapeMECARD(note)).append(';');
                    newDisplayContents.append('\n').append(note);
                }

                // Make sure we've encoded at least one field.
                if (newDisplayContents.length() > 0) {
                    newContents.append(';');
                    contents = newContents.toString();
                    displayContents = newDisplayContents.toString();
                    title = "Contact";
                } else {
                    contents = null;
                    displayContents = null;
                }

            }
        } else if (type.equals(Contents.Type.LOCATION)) {
            if (bundle != null) {
                // These must use Bundle.getFloat(), not getDouble(), it's part of the API.
                float latitude = bundle.getFloat("LAT", Float.MAX_VALUE);
                float longitude = bundle.getFloat("LONG", Float.MAX_VALUE);
                if (latitude != Float.MAX_VALUE && longitude != Float.MAX_VALUE) {
                    contents = "geo:" + latitude + ',' + longitude;
                    displayContents = latitude + "," + longitude;
                    title = "Location";
                }
            }
        }
    }

    public Bitmap encodeAsBitmap() throws WriterException {
        if (!encoded) return null;

        Map<EncodeHintType, Object> hints = null;
        String encoding = guessAppropriateEncoding(contents);
        if (encoding != null) {
            hints = new EnumMap<EncodeHintType, Object>(EncodeHintType.class);
            hints.put(EncodeHintType.CHARACTER_SET, encoding);
        }
        MultiFormatWriter writer = new MultiFormatWriter();
        BitMatrix result = writer.encode(contents, format, dimension, dimension, hints);
        int width = result.getWidth();
        int height = result.getHeight();
        int[] pixels = new int[width * height];
        // All are 0, or black, by default
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = result.get(x, y) ? BLACK : WHITE;
            }
        }

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        return bitmap;
    }

    private static String guessAppropriateEncoding(CharSequence contents) {
        // Very crude at the moment
        for (int i = 0; i < contents.length(); i++) {
            if (contents.charAt(i) > 0xFF) { return "UTF-8"; }
        }
        return null;
    }

    private static String trim(String s) {
        if (s == null) { return null; }
        String result = s.trim();
        return result.length() == 0 ? null : result;
    }

    private static String escapeMECARD(String input) {
        if (input == null || (input.indexOf(':') < 0 && input.indexOf(';') < 0)) { return input; }
        int length = input.length();
        StringBuilder result = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            char c = input.charAt(i);
            if (c == ':' || c == ';') {
                result.append('\\');
            }
            result.append(c);
        }
        return result.toString();
    }
}
82
Wesam

Le

compile 'com.google.zxing:core:2.3.0'

malheureusement, cela n'a pas fonctionné pour moi.

C'est ce qui a fonctionné pour moi:

dependencies {
   compile 'com.journeyapps:zxing-Android-embedded:3.0.1@aar'
   compile 'com.google.zxing:core:3.2.0'
}

Veuillez trouver le lien ici: https://github.com/journeyapps/zxing-Android-embedded

15
Karoly

Vous rencontrez des problèmes avec ANT? Continue de lire

Si ant -f core/build.xml dit quelque chose comme:

Unable to locate tools.jar. Expected to find it in
C:\Program Files\Java\jre6\lib\tools.jar

puis définissez votre variable d’environnement Java_HOME sur le dossier approprié Java. J'ai trouvé tools.jar dans (pour Windows):

C:\Program Files\Java\jdk1.6.0_21\lib

donc je règle mon Java_HOME sur:

C:\Progra~1\Java\jdk1.6.0_25

la raison de la syntaxe plus courte que j'ai trouvée sur un site qui dit:

"Il est vivement conseillé de choisir un répertoire d'installation ne contenant pas d'espaces dans le nom du chemin (par exemple, NE PAS installer dans C:\Program Files). Si Java est installé dans un tel répertoire, Il est essentiel de définir la variable d’environnement Java_HOME sur un chemin n’incluant pas d’espace (par exemple, C:\Progra ~ 1). Dans le cas contraire, des exceptions seront renvoyées par certains programmes qui dépendent de la valeur de Java_HOME. "

J'ai ensuite relancé cmd (important parce que le shell DOS ne lit que les variables env lors du lancement; si vous modifiez une variable env, vous devrez utiliser un nouveau shell pour obtenir la valeur mise à jour).

et finalement le ant -f core/build.xml a fonctionné.

11
danicolaj

Certaines réponses étant obsolètes, j'aimerais vous donner ma propre ...

Pour intégrer la bibliothèque ZXing à votre application Android comme suggéré par leur wiki , vous devez ajouter 2 fichiers Java à votre projet:

Puis dans Android Studio , ajoutez la ligne suivante au fichier build.gradle :

dependencies {
    ....
    compile 'com.google.zxing:core:3.2.1'
}

Ou, si vous utilisez toujours Eclipse avec ADT-plugin , ajoutez le fichier core.jar au libs sous-répertoire de votre projet (ici plein écran Windows et plein écran Mac ):

Windows screenshot

Enfin, ajoutez ce code à votre MainActivity.Java :

public void scanQRCode(View v) {
    IntentIntegrator integrator = new IntentIntegrator(MainActivity.this);
    integrator.initiateScan(IntentIntegrator.QR_CODE_TYPES);
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    IntentResult result = 
        IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
    if (result != null) {
        String contents = result.getContents();
        if (contents != null) {
            showDialog(R.string.result_succeeded, result.toString());
        } else {
            showDialog(R.string.result_failed,
                getString(R.string.result_failed_why));
        }
    }
}

private void showDialog(int title, CharSequence message) {
    AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setTitle(title);
    builder.setMessage(message);
    builder.setPositiveButton(R.string.ok_button, null);
    builder.show();
}

L'application résultante vous demandera d'installer et de démarrer application Barcode Scanner de ZXing (qui reviendra automatiquement à votre application après la numérisation):

Barcode Scanner app

De plus, si vous souhaitez créer et exécuter l'application application de test ZXing comme source d'inspiration pour votre propre application:

ZXing Test app

Ensuite, vous avez besoin de 4 Java fichiers de GitHub :

  • BenchmarkActivity.Java
  • BenchmarkAsyncTask.Java
  • BenchmarkItem.Java
  • ZXingTestActivity.Java

Et 3 fichiers Jar de référentiel Maven :

  • core.jar
  • Android-core.jar
  • Android-integration.jar

(Vous pouvez créer vous-même les fichiers Jar avec mvn package - si vous extrayez ZXing de GitHub et installez ant et maven des outils sur votre ordinateur).

Remarque: si votre projet ne reconnaît pas les fichiers Jar, vous devrez peut-être utiliser la version Java dans les propriétés du projet:

properties screenshot

11
Alexander Farber

Mettre

compile 'com.google.zxing:core:2.3.0' 

dans vos dépendances Gradle. Aussi facile que ça. Avant d’utiliser Android Studio et le système de génération Gradle.

4
Kevin Tan

Avez-vous vu le pages wiki sur le site Web zxing? Il semble que vous pourriez trouver GettingStarted , DeveloperNotes et ScanningViaIntent .

4
Scott W

Pas à pas pour configurer zxing 3.2.1 dans Eclipse

  1. Téléchargez zxing-master.Zip à partir de " https://github.com/zxing/zxing "
  2. Décompressez zxing-master.Zip, utilisez Eclipse pour importer un projet "Android" dans zxing-master
  3. Téléchargez le fichier core-3.2.1.jar à partir de " http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ "
  4. Créez le dossier "libs" dans le projet "Android" et collez cor-3.2.1.jar dans le dossier libs.
  5. Cliquez sur le projet: choisissez "propriétés" -> "compilateur Java" pour changer le niveau à 1.7. Cliquez ensuite sur "Android", puis "Modification de la cible du projet" en Android 4.4.2+, car l'utilisation de la version 1.7 nécessite la compilation avec Android 4.4.
  6. Si "CameraConfigurationUtils.Java" n'existe pas dans "zxing-master/Android/app/src/main/Java/com/google/zxing/client/Android/camera /". Vous pouvez le copier depuis "zxing-master/Android-core/src/main/Java/com/google/zxing/client/Android/appareil photo /" et le coller dans votre projet.
  7. Nettoyer et construire le projet. Si votre projet affiche une erreur à propos de "switch-case", vous devez les remplacer par "if-else".
  8. Terminé. Nettoyer et construire le projet.
  9. Lien de référence: tilisation de ZXing pour créer une application de numérisation de codes à barres Android
2
Anh Duy

Pourquoi utiliser une bibliothèque externe, lorsque les services de Google Play (à partir de la version 7.8. ) incluent un décodeur de code à barres.

2
pellucide

Les gars de zxing ont rendu plus facile la création d’un projet Android avec 1.7. Ce n'est pas aussi douloureux qu'avant. Ceci est un blog rapide pour tous ceux qui souhaitent créer rapidement un projet zxing pour Android.

  • Commander les sources zxing de zxing.org
  • Créez un projet Android sur votre Eclipse
  • Supprimer main.xml
  • Faites un clic droit sur le répertoire "src" et cliquez sur importer. Accédez aux répertoires suivants dans l'ordre indiqué. Au fur et à mesure que vous les ajoutez à l'importation un par un, assurez-vous de disposer du répertoire src dans le champ d'édition de l'assistant d'importation. Et que vous sélectionnez uniquement le répertoire "com" dans l'arborescence de gauche. Ne sélectionnez pas src.
  • coeur
  • Intégration Android
  • Android
  • Assurez-vous que votre version de Android sdk est 9, tout ce qui est inférieur et androidmanifest.xml pleurera.
  • Strings.xml dans l’une des langues sera bercé, il suffit de mettre un/avant le 'caractère

Un projet Android pour zxing 1.7 (commande du 20 juin).

http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html ( plus disponible )

2
Siddharth

Si vous avez juste besoin du fichier core.jar de zxing, vous pouvez ignorer ce processus et obtenir les fichiers JAR prédéfinis à partir de la page du wiki GettingStarted

Le dernier ZXing (2.2) n’a pas core.jar dans le dossier principal, mais vous pouvez obtenir le fichier core.jar à partir du zxing le référentiel Maven ici

2
josuadas

J'ai essayé tous les moyens possibles pour y parvenir, puis j'ai découvert la version Minified de xZing par JourneyApps. J'ai porté cela pour Eclipse et partagé sur GitHub.

Si vous utilisez Eclipse, utilisez ce projet: -

https://github.com/hiteshsahu/XZing-Barcode-Scanner-Minified-Eclipse

Si vous utilisez Studio, utilisez ce projet: -

https://github.com/journeyapps/zxing-Android-embedded

Avantages

  1. Le scanner de codes à barres intégré à votre application ne nécessite pas l'installation d'applications tierces à l'aide de Playstore.

  2. Vous n'avez pas besoin de vous confondre entre les bocaux Core, Android, etc., déposez simplement ces packages et les mises en page appropriées dans votre projet et vous êtes prêt à partir. Le fichier jar requis est com.google.zxing: noyau: 3.2.0 sur lequel vous pouvez télécharger

    http://mvnrepository.com/artifact/com.google.zxing/core/3.2.

  3. Pas besoin d'ajouter des tonnes de paquets voir les images ci-dessous pour comparaison

Avant :-

enter image description here

Après :-

enter image description here

  1. La partie la plus importante est qu’ils sont hautement personnalisables , c’est-à-dire. vous pouvez ajouter de la lumière flash, l'utiliser par fragments et prendre en charge le changement d'orientation.

  2. Vous pouvez utiliser cette activité de capture dans Cordova App pour la numérisation de codes à barres.

votre activité de capture dans le manifeste de l'application ressemblerait à ceci

  <activity
            Android:name="com.journeyapps.barcodescanner.CaptureActivity"
            Android:clearTaskOnLaunch="true"
            Android:configChanges="orientation|keyboardHidden"
            Android:exported="false"
            Android:screenOrientation="fullSensor"
            Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
            Android:windowSoftInputMode="stateAlwaysHidden" >
            <intent-filter>
                <action Android:name="com.google.zxing.client.Android.SCAN" />

                <category Android:name="Android.intent.category.DEFAULT" />
            </intent-filter>
        </activity>

et le plugin ressemblera à ceci

public class BarcodeScanner extends CordovaPlugin {
    public static final int REQUEST_CODE = 0x0ba7c0de;

    private static final String SCAN = "scan";
    private static final String CANCELLED = "cancelled";
    private static final String FORMAT = "format";
    private static final String TEXT = "text";
    private static final String SCAN_INTENT = "com.google.zxing.client.Android.SCAN";

    private static final String LOG_TAG = "BarcodeScanner";

    private CallbackContext callbackContext;

    /**
     * Constructor.
     */
    public BarcodeScanner() {


    }

    /**
     * Executes the request.
     *
     * This method is called from the WebView thread. To do a non-trivial amount of work, use:
     *     cordova.getThreadPool().execute(runnable);
     *
     * To run on the UI thread, use:
     *     cordova.getActivity().runOnUiThread(runnable);
     *
     * @param action          The action to execute.
     * @param args            The exec() arguments.
     * @param callbackContext The callback context used when calling back into JavaScript.
     * @return                Whether the action was valid.
     *
     * @sa https://github.com/Apache/cordova-Android/blob/master/framework/src/org/Apache/cordova/CordovaPlugin.Java
     */
    @Override
    public boolean execute(String action, JSONArray args, CallbackContext callbackContext) {
        this.callbackContext = callbackContext;
        if (action.equals(SCAN)) {
            scan(args);
        } else {
            return false;
        }
        return true;
    }

    /**
     * Starts an intent to scan and decode a barcode.
     */
    public void scan(JSONArray args) {
        Intent intentScan = new Intent(SCAN_INTENT);
        intentScan.addCategory(Intent.CATEGORY_DEFAULT);

        // add config as intent extras
        if(args.length() > 0) {

            JSONObject obj;
            JSONArray names;
            String key;
            Object value;

            for(int i=0; i<args.length(); i++) {

                try {
                    obj = args.getJSONObject(i);
                } catch(JSONException e) {
                    Log.i("CordovaLog", e.getLocalizedMessage());
                    continue;
                }

                names = obj.names();
                for(int j=0; j<names.length(); j++) {
                    try {
                        key = names.getString(j);
                        value = obj.get(key);

                        if(value instanceof Integer) {
                            intentScan.putExtra(key, (Integer)value);
                        } else if(value instanceof String) {
                            intentScan.putExtra(key, (String)value);
                        }

                    } catch(JSONException e) {
                        Log.i("CordovaLog", e.getLocalizedMessage());
                        continue;
                    }
                }
            }

        }

        // avoid calling other phonegap apps
        intentScan.setPackage(this.cordova.getActivity().getApplicationContext().getPackageName());

        this.cordova.startActivityForResult((CordovaPlugin) this, intentScan, REQUEST_CODE);
    }

    /**
     * Called when the barcode scanner intent completes.
     *
     * @param requestCode The request code originally supplied to startActivityForResult(),
     *                       allowing you to identify who this result came from.
     * @param resultCode  The integer result code returned by the child activity through its setResult().
     * @param intent      An Intent, which can return result data to the caller (various data can be attached to Intent "extras").
     */
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent intent) {
        if (requestCode == REQUEST_CODE) {
            if (resultCode == Activity.RESULT_OK) {
                JSONObject obj = new JSONObject();
                try {
                    obj.put(TEXT, intent.getStringExtra("SCAN_RESULT"));
                    obj.put(FORMAT, intent.getStringExtra("SCAN_RESULT_FORMAT"));
                    obj.put(CANCELLED, false);
                } catch (JSONException e) {
                    Log.d(LOG_TAG, "JSONException "+e.getMessage());
                }
                this.callbackContext.success(obj);
            } else if (resultCode == Activity.RESULT_CANCELED) {
                this.callbackContext.success("");
            } else {
                this.callbackContext.error("Technical Problem");
            }
        }
    }
}

Bonne intégration !!

2
Hitesh Sahu

Je viens d'écrire une méthode qui décode les codes à barres générés, Bitmap à String.

Il fait exactement ce qui est demandé, juste sans la CaptureActivity...

Par conséquent, on peut ignorer la bibliothèque Android-integration dans le build.gradle:

dependencies {
    // https://mvnrepository.com/artifact/com.google.zxing
    compile('com.google.zxing:core:3.3.0')
    compile('com.google.zxing:Android-core:3.3.0')
}

La méthode suivante (qui décode réellement les codes à barres générés dans un test jUnit):

import Android.graphics.Bitmap;

import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.RGBLuminanceSource;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.Result;

protected String decode(Bitmap bitmap) {

    MultiFormatReader reader = new MultiFormatReader();
    String barcode = null;

    int[] intArray = new int[bitmap.getWidth() * bitmap.getHeight()];
    bitmap.getPixels(intArray, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
    LuminanceSource source = new RGBLuminanceSource(bitmap.getWidth(), bitmap.getHeight(), intArray);
    BinaryBitmap binary = new BinaryBitmap(new HybridBinarizer(source));

    try {

        Result result = reader.decode(binary);
        // BarcodeFormat format = result.getBarcodeFormat(); 
        // ResultPoint[] points = result.getResultPoints();
        // byte[] bytes = result.getRawBytes(); 
        barcode = result.getText();

    } catch (NotFoundException e) {
        e.printStackTrace();
    }
    return barcode;
}
1
Martin Zeitler

J'ai récemment utilisé Google Mobile Vision dans iOS et Android. Je recommande fortement d'utiliser Google Barcode Scan. C'est assez réactif avec n'importe quelle orientation et le temps de traitement est assez rapide. Il s'appelle Google Mobile Vision.

L'API Scanner de codes à barres détecte les codes à barres en temps réel, quelle que soit leur orientation. Vous pouvez également détecter et analyser plusieurs codes à barres dans différents formats en même temps.

https://developers.google.com/vision/

https://codelabs.developers.google.com/codelabs/bar-codes/#

0
casillas

Approche beaucoup plus facile.

Incluez simplement la dépendance dans votre fichier de niveau de niveau d'application

compile 'com.journeyapps:zxing-Android-embedded:3.0.1@aar'
compile 'com.google.zxing:core:3.2.0'  

Définissez un bouton dans votre fichier XML et écrivez le code ci-dessous dans le fichier Java dans OnCreate () et à l'intérieur du bouton d'écoute OnClick

new IntentIntegrator(this).initiateScan();

Et écrivez en dessous du code après OnCreate () du fichier Java

@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.d("MainActivity", "Cancelled scan");
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
        } else {
            Log.d("MainActivity", "Scanned");
            String st_scanned_result = result.getContents();
            Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();

        }
    }

}
0
Tara