web-dev-qa-db-fra.com

Comment intégrer Zxing Barcode Scanner sans installer l'application réelle zxing (impossible de résoudre le symbole: .Android.CaptureActivity)?

Je souhaite intégrer le scanner zxing à mon application sans recourir à une application externe (scanner zxing de Play Store). C'est mon code

Button scan = (Button) findViewById(R.id.scan_button);
scan.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Intent intent = new Intent("com.google.zxing.client.Android.SCAN");
        intent.setPackage("com.mypackage.app");
        intent.putExtra("SCAN_MODE", "QR_CODE_MODE");
        startActivityForResult(intent, SCANNER_REQUEST_CODE);
    }
});

@Override
public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    if (requestCode == SCANNER_REQUEST_CODE) {
        // Handle scan intent
        if (resultCode == Activity.RESULT_OK) {
            // Handle successful scan
            String contents = intent.getStringExtra("SCAN_RESULT");
            String formatName = intent.getStringExtra("SCAN_RESULT_FORMAT");
            byte[] rawBytes = intent.getByteArrayExtra("SCAN_RESULT_BYTES");
            int intentOrientation = intent.getIntExtra("SCAN_RESULT_ORIENTATION", Integer.MIN_VALUE);
            Integer orientation = (intentOrientation == Integer.MIN_VALUE) ? null : intentOrientation;
            String errorCorrectionLevel = intent.getStringExtra("SCAN_RESULT_ERROR_CORRECTION_LEVEL");

        } else if (resultCode == Activity.RESULT_CANCELED) {
            // Handle cancel
        }
    } else {
        // Handle other intents
    }

}

AndroidManifest.xml

<activity Android:name="com.google.zxing.client.Android.CaptureActivity"
    Android:screenOrientation="landscape"
    Android:configChanges="orientation|keyboardHidden"
    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>

Mon Android Studio a déclaré qu'il ne pouvait pas résoudre le symbole: .Android.CaptureActivity et si je lance ceci, une erreur survient

Java.lang.ClassNotFoundException: la classe "com.google.zxing.client.Android.CaptureActivity" n'a pas été trouvée

Qu'est-il arrivé?

31
stackex

Je ne sais pas pourquoi c'est arrivé, mais finalement j'utilise une autre bibliothèque. J'utilise Zxing-Android-minimal et un tutoriel de ici et ici . Maintenant ça marche.

29
stackex

Bien que nous ayons déjà répondu, je me sens comme une solution approfondie pour ceux qui souhaitent utiliser ZXing en tant que bibliothèque sans utiliser aucune méthode d’installation automatique telle que ANT.

ZXing étant un projet open source vous permet (comme décrit sur le site Web de ZXing) d’utiliser ses fonctionnalités en tant que bibliothèque de projets plutôt que de forcer l’installation d’applications tierces sur le périphérique de l’utilisateur. À mon avis, il s’agit du choix préféré pour la plupart des projets.

Il est important de noter que cette méthode est acceptable par les créateurs et ne violera aucune de leurs conditions d'utilisation, car nous n'allons pas copier leur code, mais simplement l'utiliser comme une bibliothèque de notre projet.

Le processus général est le suivant:

  1. Téléchargement du code source et du fichier core de ZXing.
  2. Importer le projet ZXing dans l’environnement de votre choix (Eclipse/Studio)
  3. Définir le projet ZXing comme une bibliothèque et corriger le code pour répondre à ces exigences.
  4. Ajout de ZXing au chemin de construction de votre propre projet
  5. Ajout de méthodes ZXing selon les besoins de votre application.

Voici une procédure entièrement détaillée pour ceux qui utilisent Eclipse (qui peut également être très facilement implémentée pour Studio):

Téléchargement du code source et du fichier core de ZXing

  1. Allez sur la page du projet GitHub de ZXing ( https://github.com/zxing/zxing ) et cliquez sur "Télécharger le zip".
  2. Extrayez les fichiers (je vous recommande d’utiliser quelque part la plupart des autres sources de votre bibliothèque)

Importation du projet ZXing dans Eclipse

  1. Ouvrez Eclipse.
  2. Cliquez sur Fichier> Importer,> Android> "Existant Android Code dans l'espace de travail"), dans la fenêtre de sélection, naviguez jusqu'au dossier où vous avez extrait le fichier ZXing Zip et sélectionnez le dossier "Android". Eclipse devrait maintenant détecter que le dossier contient un projet appelé "captureActivity", puis importer ce projet.
  3. Vous devriez maintenant voir l'activité de capture dans votre espace de travail. Selon la version de ZXing dont vous disposez, vous devrez peut-être affecter un fichier core.jar au projet ZXing. Pour vérifier si tel est le cas pour votre version, ouvrez le dossier libs du projet captureActivity et vérifiez si le fichier core.jar existe, sinon que vous devez l’ajouter vous-même, sinon passez au chapitre suivant.

    5.1. Pour ajouter le fichier core.jar, cliquez avec le bouton droit sur le projet captureActivity dans l'espace de travail Eclipse et sélectionnez Chemin de construction> configurer le chemin de construction.

    5.2. Dans le menu latéral, sélectionnez Java Build Path et cliquez sur l'onglet Bibliothèques.

    5.3.Cliquez sur "Ajouter des fichiers JAR externes" et accédez au lieu où vous avez exporté le fichier ZXing.

    5.4. Entrez le dossier principal et sélectionnez core.jar (le nom peut différer selon la version de ZXing), puis cliquez sur Ouvrir.

    5.5. Vous devriez maintenant voir core.jar dans votre liste de chemins de construction, cliquez sur l'onglet "Commander et exporter" et vérifiez core.jar.

Définir ZXing en tant que bibliothèque et corriger le code

  1. Si vous n'êtes pas déjà dans la fenêtre du chemin de construction, cliquez avec le bouton droit de la souris sur le projet captureActivity et sélectionnez Chemin de construction> configurer le chemin de construction.
  2. Dans le menu latéral, sélectionnez Android et cochez la case Bibliothèque, cliquez sur Ok pour quitter la fenêtre.)
  3. Maintenant, selon la version de ZXing que vous possédez, Eclipse peut marquer certains des Java contenant des erreurs. Dans ce cas, vous devrez corriger le code pour faire correspondre Android Java, sinon passez simplement au chapitre suivant

    8.1. Ouvrez chaque fichier brisé Java dans l'éditeur et remplacez les instructions Switch brisées par une chaîne d'instructions If Else, c'est une partie ennuyeuse que je connais.

Ajoutez ZXing en tant que bibliothèque de votre propre projet

  1. Si tout va bien maintenant, captureActivity devrait apparaître comme n'importe quel dossier de projet normal dans votre espace de travail, sans erreur ni rouge! signe. Pour définir ZXing comme une bibliothèque dans votre propre projet, cliquez avec le bouton droit de la souris sur votre projet dans l'espace de travail et sélectionnez Chemin de construction> Configurer le chemin de construction.
  2. Dans le menu latéral, sélectionnez Android. Cliquez sur le bouton Ajouter dans le coin inférieur droit de la fenêtre, puis sélectionnez captureActivity dans la fenêtre.
  3. Ça y est, votre projet peut maintenant utiliser ZXing en tant que bibliothèque indépendante sans avoir besoin d'une installation tierce.

Ajout des méthodes de ZXing requises par votre application

Cette partie n'est pas vraiment un guide mais simplement ce que j'ai trouvé utile pour mes propres besoins jusqu'à présent, les deux méthodes que j'utilise le plus souvent sont les suivantes:

Lancer le scanner et capturer un code QR:

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.Android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

Récupérer les résultats de l'analyse dans onActivityResult ():

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

Notez que, comme toute autre activité dans Android doit également être définie dans le manifeste du projet, notez également que vous devez autoriser le projet à utiliser l'appareil photo comme suit:

<uses-permission Android:name="Android.permission.CAMERA" />
<activity
Android:name="com.google.zxing.client.Android.CaptureActivity"
Android:screenOrientation="landscape" >
</activity>

J'espère que cela aidera les autres à économiser quelques bonnes heures de recherche.

En prime, je recommande la lecture suivante: https://biocram.wordpress.com/2013/06/11/integrate-zxing-as-a-library-inside-an-Android-project/

46
Liran Cohen

Comme toutes les réponses que j'ai trouvées jusqu'à présent sont basées sur Eclipse et sont assez anciennes, j'ajoute ma réponse pour ajouter ZXing en tant que bibliothèque autonome sur Android Studio (2.1.2) .

J'ai mis le projet compilé sur Github https://github.com/tarun0/ZXing-Standalone-library Ajoutez simplement le module zxing_standalone Dans votre projet et vous serez bon aller. Pour plus de détails ou pour le compiler pour les versions plus récentes, continuez à lire.

Cela peut sembler une procédure longue, mais une fois que vous avez parcouru le processus, vous le trouverez assez facile et court.

  1. Téléchargez le code source de la bibliothèque ZXing à partir de https://github.com/zxing/zxing/ Nous n'aurons besoin que du répertoire Android. Donc, si vous avez déjà ce dossier, vous n'avez pas besoin de télécharger toute la branche, qui fait environ 126 Mo de taille.
  2. Téléchargez la dernière core-x.x.x.jar De http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/
  3. Ajoutez le projet Android dans votre propre projet. Pour ce faire, choisissez d’abord le Project dans le Project Explorer (Reportez-vous à l’image).

enter image description here

  1. Maintenant, cliquez sur votre projet, cliquez dessus avec le bouton droit de la souris et sélectionnez New> Module> Import Gradle Project. Sélectionnez maintenant le répertoire Android à partir du code source téléchargé (à l’étape 1). (Référence photo ci-dessous pour le novice absolu). Vous pouvez éventuellement modifier le nom et laisser les paramètres par défaut pour l'importation. enter image description here
  2. Dans ce projet importé, créez un dossier libs et placez le fichier core.jar Téléchargé à l'étape 2 dans ce dossier. Ensuite, ouvrez Project Structure Dans le menu Fichier et ajoutez ce fichier core.jar En tant que dépendance.

enter image description hereIn step 2 Select <code>Add file dependency</code>

  1. Téléchargez CameraConfigurationalUtils.Java et collez-le dans le projet. enter image description here

  2. Effectuez maintenant quelques modifications dans le fichier Gradle du projet importé. Remplacez apply plugin: 'com.Android.application' Par apply plugin: 'com.Android.library' Pour indiquer au système qu'il s'agit d'une bibliothèque. Et supprimez la déclaration applicationId ....

  3. Dans le fichier Manifest.xml Du projet importé, apportez les modifications suivantes. Dans la balise <application..., Supprimez les Android:icon... Et Android:logo..., Puis supprimez ce <category Android:name="Android.intent.category.LAUNCHER"/> Du filtre d'intention, car il s'agit d'une bibliothèque et n'est pas censé l'être. sur le lanceur (si vous ne le supprimez pas, vous aurez deux activités de lanceur).

  4. Dans le fichier build.gradle De votre projet, dans le bloc dependencies, ajoutez cette ligne compile project (':Android') Ici, remplacez le Android par le nom que vous avez choisi lors de l'importation du projet. à l'étape 4. Synchronisez et nettoyez le projet. Vous verrez des erreurs dans les instructions switch. Cliquez sur ces cas de commutation et sélectionnez l'option replace with if Fournie par Android Studio.

C'est ça. Vous pouvez maintenant utiliser la bibliothèque ZXing dans votre propre application. :)

Pour utiliser la bibliothèque ajoutée, utilisez simplement Intents comme indiqué dans la toute première réponse ci-dessus (en copiant les mêmes codes uniquement):

Pendant la numérisation (comme en cliquant sur un bouton), envoyez l’intention:

Intent intent = new Intent(getApplicationContext(),CaptureActivity.class);
intent.setAction("com.google.zxing.client.Android.SCAN");
intent.putExtra("SAVE_HISTORY", false);
startActivityForResult(intent, 0);

Ensuite, dans OnActivityResult:

if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = data.getStringExtra("SCAN_RESULT");
Log.d(TAG, "contents: " + contents);
} else if (resultCode == RESULT_CANCELED) {
// Handle cancel
Log.d(TAG, "RESULT_CANCELED");
}
}

J'ai essayé d'être aussi descriptif que possible. J'espère que les gens le trouveront utile.

Veuillez lire cette réponse de l’un des auteurs du code concernant la copie du code dans votre propre application: https://stackoverflow.com/a/9942761

Références: https://stackoverflow.com/a/29818279https://stackoverflow.com/a/29960361 Et quelques autres blogs/réponses SO.

39
T.M

Je suis vraiment en retard mais je souhaite répondre à cette question pour que quelqu'un d'autre soit aidé plus tard. Cela ne veut pas dire que les méthodes et la solution ci-dessus sont fausses, c’est juste une information supplémentaire, donc, pour le développeur, il/elle choisira la meilleure façon. Il est bon d’avoir mille façons de faire que d’en avoir une.

Commençons donc dans notre grade et ajoutons

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

Appeler le module comme (par exemple: sur un clic de bouton):

IntentIntegrator integrator = new IntentIntegrator(Home.this);
            integrator.setDesiredBarcodeFormats(IntentIntegrator.ALL_CODE_TYPES);
            integrator.setPrompt("Scan Code");
            integrator.setCameraId(0);
            integrator.setBeepEnabled(true);
            integrator.setBarcodeImageEnabled(false);
            integrator.initiateScan();

Obtenez les résultats comme:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    IntentResult intentResult = IntentIntegrator.parseActivityResult(requestCode, resultCode, data);
    if(intentResult != null) {
        if(intentResult.getContents() == null) {
            Log.d("MainActivity", "Cancelled");
            Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();

        } else {
            Log.d("MainActivity", "Scanned");
            Toast.makeText(this, "Scanned: " + intentResult.getContents(), Toast.LENGTH_LONG).show();
        }
    }

}

Pour plus d'informations, vous pouvez consulter le lien https://github.com/pethoalpar/ZxingExample

Si vous avez des difficultés à trouver le bocal comme moi, vous avez l'URL suivante:

http://repo1.maven.org/maven2/com/google/zxing/

3
Julián Vega

Dans mon code je suis arrivé à cette version:

Camera.PreviewCallback myCallBack = new Camera.PreviewCallback() {
   @Override public void onPreviewFrame(byte[] data, Camera camera)
   {
      Camera.Parameters parameters = camera.getParameters();
      int width = parameters.getPreviewSize().width;
      int height = parameters.getPreviewSize().height;
      int format = parameters.getPreviewFormat();
      LuminanceSource source = null;
      if(format == ImageFormat.NV21) //YCbCr_420_SP)
      {
         source = new PlanarYUVLuminanceSource(imgData, bitmapWidth, bitmapHeight, 0,0, bitmapWidth,bitmapHeight, false);
      } else
      {
         throw new UnsupportedOperationException("Unsupported image format ");
      }
      BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));
      try
      {
         Result result = reader.decode(bBitmap);
         txt.setText(result.getText())
      } catch (NotFoundException e)
      {
         //txt.setText("");
      }
   }
};

avec

import Android.hardware.Camera;
import com.google.zxing.BinaryBitmap;
import com.google.zxing.LuminanceSource;
import com.google.zxing.MultiFormatReader;
import com.google.zxing.NotFoundException;
import com.google.zxing.PlanarYUVLuminanceSource;
import com.google.zxing.Result;
import com.google.zxing.common.HybridBinarizer;

Camera mCamera;
MultiFormatReader reader;
TextView txt;

J'espère que cela aidera quelqu'un.

Antonino

3
Perry

Elaborer la réponse de stackex .... Créez une activité avec n'importe quel nom.

public class CaptureActivityAnyOrientation extends CaptureActivity {
}

Manifestez définir l’orientation souhaitée ou laissez comme ci-dessous pour travailler à la fois en paysage et en portrait.

<activity Android:name=".CaptureActivityAnyOrientation"
      Android:screenOrientation="fullSensor"
      Android:stateNotNeeded="true"
      Android:theme="@style/zxing_CaptureTheme"
      Android:windowSoftInputMode="stateAlwaysHidden"/>

Enfin, utilisez l’activité créée en tant que setCaptureActivity.

IntentIntegrator.forSupportFragment(fragment)
                    .setCaptureActivity(CaptureActivityAnyOrientation.class)
                    .setOrientationLocked(false)
                    .setBeepEnabled(true)
                    .addExtra("Prompt_MESSAGE", "Scan QR Code")
                    .initiateScan(IntentIntegrator.QR_CODE_TYPES);

J'espère que cela t'aides.

2
Sachet Bajracharya

Voici une manière qui fonctionne sur Eclipse:

Intégration ZXing sur Eclipse Android app

Bonne intégration!

0
Hubert Solecki

Comme ce fil est vieux, mais je viens d’entrer dans ce numéro. Donc, je ne fais que publier pour toute autre personne qui est sur Android Studio et veut intégrer des classes de base. Tout ce que vous avez à faire est simplement d’ajouter cette dépendance

implementation 'com.google.zxing:core:x.x.x'

Android Studio vous proposera automatiquement la dernière version pour ce qui précède.

0
Aziz