web-dev-qa-db-fra.com

Intégrer ZXing dans Android Studio

Je vais commencer par expliquer toutes les étapes que j’ai accomplies et à la fin quel est le problème.

  1. Téléchargez ZXing-2.2 https://code.google.com/p/zxing/downloads/list
  2. Extrac tout dans zxing-2.2.
  3. Téléchargez et installez Apache Ant http://www.youtube.com/watch?v=XJmndRfb1TU
  4. Avec l’utilisation de Windows Commandline (Run-> CMD), accédez au répertoire extrait.
  5. 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

À ce moment, c’est comme Intégrer la bibliothèque ZXing directement dans mon application Android

Mais Wooops, "Buildfile: core\build.xml n’existe pas! La construction a échoué. Ok. 6. Importation de ZXing - noyau manquant/build.xml

Maintenant oui, j'ai mon core.jar.

  1. Ouvrez Android Studio, Fichier -> Importer un projet -> Sélectionnez/Android/dans /zxing-2.2/-> Créer un projet à partir de sources existantes -> Nom du projet: andoid -> Fichiers sources pour ... tous cochés Suivant -> Bibliothèques (rien ne peut être fait) Suivant -> Modules (Android vérifié) Suivant -> SDK 1.7 Suivant -> Terminer

Avec le projet ouvert -> Construire -> Reconstruire le projet

100 erreurs 19 avertissements

Fichier -> Structure du projet -> Bibliothèques -> Ajouter -> Java -> Sélectionnez le fichier core.jar que je crée avant et OK -> La bibliothèque 'core' sera ajoutée aux modules sélectionnés. (Android) OK -> Et OK dans la boîte de dialogue Structure du projet.

Construire -> Reconstruire le projet

15 erreurs 20 avertissements

Toutes les erreurs sont des erreurs: expression constante requise et je vois Erreur dans les cas de basculement du projet ZXing sous Android Je modifie tous les commutateurs pour if elses.

0 erreurs 20 avertissements

Ok, continuez maintenant:

Fichier -> Nouveau projet -> zxing_demo Suivant -> Suivant -> Activité vide Suivant -> Terminer

Dans un nouveau projet -> Fichier -> Module d'importation -> Rechercher et sélectionner/Android/OK -> Créer un module à partir de sources existantes Suivant -> Suivant -> Suivant -> Suivant -> Terminer

Maintenant, je peux voir dans l'explorateur/Android// zging_demoProject/et les bibliothèques externes

Maintenant, je change mon code tu scan QR

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
package="com.example.zxing_demo"
Android:versionCode="1"
Android:versionName="1.0" >

<uses-sdk
    Android:minSdkVersion="7"
    Android:targetSdkVersion="16" />
<uses-permission Android:name="Android.permission.CAMERA"/>
<uses-feature Android:name="Android.hardware.camera" />
<uses-feature
    Android:name="Android.hardware.camera.autofocus"
    Android:required="false" />
<uses-feature
    Android:name="Android.hardware.touchscreen"
    Android:required="false" />
<application
    Android:allowBackup="true"
    Android:icon="@drawable/ic_launcher"
    Android:label="@string/app_name"
    Android:theme="@style/AppTheme" >
    <activity
        Android:name="com.example.zxing_demo.MainActivity"
        Android:label="@string/app_name" >
        <intent-filter>
            <action Android:name="Android.intent.action.MAIN" />

            <category Android:name="Android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity
        Android:clearTaskOnLaunch="true"
        Android:stateNotNeeded="true"
        Android:configChanges="orientation|keyboardHidden"
        Android:name="com.google.zxing.client.Android.CaptureActivity"
        Android:screenOrientation="landscape"
        Android:theme="@Android:style/Theme.NoTitleBar.Fullscreen"
        Android:windowSoftInputMode="stateAlwaysHidden" >
        <intent-filter >
            <action Android:name="Android.intent.action.MAIN" />
            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>
        <intent-filter >
            <action Android:name="com.google.zxing.client.Android.SCAN" />
            <category Android:name="Android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
</application>

MainActivity.Java

package com.example.zxing_demo;

import Android.app.Activity;
import Android.content.Intent;
import Android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Intent intent = new Intent("com.google.zxing.client.Android.SCAN");
    intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
    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");
            // Handle successful scan
        } else if (resultCode == RESULT_CANCELED) {
            // Handle cancel
        }
    }
}

}

Maintenant tester, Exécuter -> Déboguer

Et CRASH.

Logcat

08-31 02:58:28.085  20665-20665/com.example.zxing_demo E/AndroidRuntime: FATAL EXCEPTION: main
    Java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.zxing_demo/com.google.zxing.client.Android.CaptureActivity}: Java.lang.ClassNotFoundException: com.google.zxing.client.Android.CaptureActivity
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1891)
    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1992)
    at Android.app.ActivityThread.access$600(ActivityThread.Java:127)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1158)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:137)
    at Android.app.ActivityThread.main(ActivityThread.Java:4448)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:511)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:823)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:590)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: Java.lang.ClassNotFoundException: com.google.zxing.client.Android.CaptureActivity
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:61)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:501)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:461)
    at Android.app.Instrumentation.newActivity(Instrumentation.Java:1023)
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1882)
    ... 11 more

Je peux voir dans AndroidManifest.xml dans cette ligne

Android:name="com.google.zxing.client.Android.CaptureActivity"

"CaptureActivity" en rouge et l'erreur indique: Impossible de résoudre le symbole "CaptureActivity"

Fichier -> Structure du projet -> Modules -> zxing_demo -> Dépendances -> Ajouter -> Dépendance du module -> Android OK -> Appliquer et OK

Maintenant, CaptureActivity semble bon

Debug à nouveau

08-31 03:06:58.513  21740-21740/com.example.zxing_demo E/AndroidRuntime: FATAL EXCEPTION: main
    Java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.example.zxing_demo/com.google.zxing.client.Android.CaptureActivity}: Java.lang.ClassNotFoundException: com.google.zxing.client.Android.CaptureActivity
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1891)
    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:1992)
    at Android.app.ActivityThread.access$600(ActivityThread.Java:127)
    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1158)
    at Android.os.Handler.dispatchMessage(Handler.Java:99)
    at Android.os.Looper.loop(Looper.Java:137)
    at Android.app.ActivityThread.main(ActivityThread.Java:4448)
    at Java.lang.reflect.Method.invokeNative(Native Method)
    at Java.lang.reflect.Method.invoke(Method.Java:511)
    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:823)
    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:590)
    at dalvik.system.NativeStart.main(Native Method)
    Caused by: Java.lang.ClassNotFoundException: com.google.zxing.client.Android.CaptureActivity
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.Java:61)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:501)
    at Java.lang.ClassLoader.loadClass(ClassLoader.Java:461)
    at Android.app.Instrumentation.newActivity(Instrumentation.Java:1023)
    at Android.app.ActivityThread.performLaunchActivity(ActivityThread.Java:1882)
    ... 11 more

Je pense que je vais utiliser l'application et les intentions, mais maintenant je veux faire ce travail, si quelqu'un maintenant ce qui se passe, dites-le moi s'il vous plaît.

87
Victor Company

J'intégrais ZXING dans une application Android et il n'y avait aucune bonne source pour la saisie, je vais vous donner un indice sur ce qui a fonctionné pour moi - , car il tournait être très facile .

Il existe un véritable référentiel git très pratique qui fournit le projet de bibliothèque zxing Android sous forme d'archive AAR.

Tout ce que vous avez à faire est d’ajouter ceci à votre build.gradle

repositories {
    jcenter()
}

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

et Gradle fait toute la magie pour compiler le code et le rendre accessible dans votre application.

Pour démarrer le scanner par la suite, utilisez cette classe/méthode: A partir de l'activité:

new IntentIntegrator(this).initiateScan(); // `this` is the current Activity

À partir d'un fragment:

IntentIntegrator.forFragment(this).initiateScan(); // `this` is the current Fragment
// If you're using the support library, use IntentIntegrator.forSupportFragment(this) instead.

Il existe plusieurs options de personnalisation:

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setDesiredBarcodeFormats(IntentIntegrator.ONE_D_CODE_TYPES);
integrator.setPrompt("Scan a barcode");
integrator.setCameraId(0);  // Use a specific camera of the device
integrator.setBeepEnabled(false);
integrator.setBarcodeImageEnabled(true);
integrator.initiateScan();

Ils ont un exemple de projet et fournissent plusieurs exemples d'intégration:

Si vous avez déjà visité le lien, vous verrez que je viens de copier-coller le code à partir du fichier README de git. Sinon, allez-y pour avoir plus d'informations et des exemples de code.

219
Langusten Gustel
buttion.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new com.google.zxing.integration.Android.IntentIntegrator(Fragment.this).initiateScan();
            }
        });

    public 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");
                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);
        }
    }



dependencies {
    compile 'com.journeyapps:zxing-Android-embedded:3.2.0@aar'
    compile 'com.google.zxing:core:3.2.1'
    compile 'com.Android.support:appcompat-v7:23.1.0'
}
6
Hardip

Toute personne confrontée aux mêmes problèmes, suivez les étapes simples suivantes:

Importez le projet Android à partir du fichier zxing-master téléchargé en utilisant l’option Import project (Eclipse ADT, Gradle, etc.) et ajoutez les 2 lignes de codes suivantes dans votre fichier build.gradle de niveau application et vous êtes prêt à exécuter.

Si simple, yahh ...

dependencies {
        // https://mvnrepository.com/artifact/com.google.zxing/core
        compile group: 'com.google.zxing', name: 'core', version: '3.2.1'
        // https://mvnrepository.com/artifact/com.google.zxing/Android-core
        compile group: 'com.google.zxing', name: 'Android-core', version: '3.2.0'

    }

Vous pouvez toujours trouver la dernière version core et Android core parmi les liens ci-dessous:

https://mvnrepository.com/artifact/com.google.zxing/core/3.2.1https://mvnrepository.com/artifact/com.google.zxing/Android- noyau/3.2.

MISE À JOUR (29.05.2019)

Ajoutez ces dépendances à la place:

dependencies {
    implementation 'com.google.zxing:core:3.4.0'
    implementation 'com.google.zxing:Android-core:3.3.0'
}
5
Smeet