Comment intégrer le Scanner de code à barres de Zxing sans installer l'application réelle de zxing (ne peut pas résoudre le symbole:.Android.CaptureActivity)?

je veux intégrer le scanner zxing dans mon application sans avoir besoin d'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 studio Android a dit que ne peut pas résoudre le symbole: .android.CaptureActivity et si je l'exécute, une erreur s'est produite

de java.lang.ClassNotFoundException: N'a pas trouvé class "COM.Google.zxing.client.Android.Captureactivité "

que s'est-il passé?

27
demandé sur TofferJ 2015-03-20 06:50:31

8 réponses

bien que déjà répondu, je me sens comme une solution en profondeur pour ceux qui veulent utiliser ZXing comme une bibliothèque sans utiliser une méthode d'installation automatique comme ANT.

ZXing étant un projet open source permettre (comme décrit dans le site Web de ZXing) vous d'utiliser ses fonctionnalités comme une bibliothèque de projets plutôt que de forcer l'installation d'applications tierce partie sur le périphérique utilisateurs, à mon avis, ce est le choix préféré pour la plupart des projets.

il est important de noter que c'est acceptable par les créateurs et ne violera l'un de leurs conditions d'utilisation, puisque nous n'allons pas copier le code, mais simplement l'utiliser comme une bibliothèque de notre projet.

le procédé général est le suivant:

  1. télécharger le code source et le fichier de base de ZXing.
  2. importer le projet ZXing à n'importe quel environnement que vous désirez (Eclipse/Studio)
  3. Définissant ZXing projet d'agir en tant que Bibliothèque et de fixer 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 tel que requis par votre application.

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

télécharger le code source et le fichier de base de ZXing

  1. aller à la page du projet Github de ZXing ( https://github.com/zxing/zxing ) et cliquez sur"Télécharger zip".
  2. extraire les fichiers (je recommande d'utiliser quelque part la plupart de vos autres sources de bibliothèque sont situés)

l'Importation de la ZXing projet Eclipse

  1. Ouvrez Eclipse.
  2. cliquez sur Fichier > Importer, > Android> "Code Android existant dans L'espace de travail", à partir de la fenêtre de sélection, naviguez vers le dossier dans lequel vous avez extrait le fichier zip ZXing et sélectionnez le dossier "Android". Eclipse devrait maintenant détecter le dossier contenant un projet appelé "captureActivity", importer ce projet.
  3. vous devriez maintenant Voir l'activité de capture dans votre espace de travail. Selon la version ZXing que vous avez, vous pourriez avoir besoin d'assigner le noyau.le fichier jar à le projet ZXing, pour vérifier si c'est le cas pour votre version ouvrez le dossier libs du projet captureActivity et vérifiez si core.jar existe, si pas que vous devez l'ajouter vous-même, sinon, passez directement au chapitre suivant.

    5.1. Ajouter la carotte.cliquez avec le bouton droit de la souris sur le projet captureActivity dans L'espace de travail Eclipse et sélectionnez Build path>configure build path

    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 pots externes" et naviguez vers L'endroit où vous avez initialement exporté ZXing zip.

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

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

définir ZXing comme une bibliothèque et la fixation du code

  1. si vous n'êtes pas déjà dans la fenêtre de chemin de compilation, faites un clic droit sur le projet captureActivity et sélectionnez Chemin de compilation>configurer chemin de compilation.
  2. dans le menu latéral, sélectionnez Android et vérifiez si la bibliothèque, cliquez sur Ok pour quitter la fenêtre
  3. maintenant, selon la version de ZXing que vous avez, vous pouvez voir éclipse marquer certains des fichiers java contenant des erreurs, si c'est le cas, vous devrez corriger le code à match version java android, sinon passer simplement au chapitre suivant

    8.1. Ouvrez chaque fichier java cassé dans l'éditeur et remplacez les déclarations Switch cassées par une chaîne de déclarations If Else, c'est une partie ennuyeuse que je sais.

ajouter ZXing comme une bibliothèque de votre propre projet

  1. si tout va bien maintenant la captureactivité devrait apparaître comme n'importe quelle normale dossier de projet dans votre espace de travail, aucune erreur ou rouge ! signer. Pour définir ZXing comme une bibliothèque dans votre propre projet, faites un clic droit sur votre projet dans l'espace de travail et sélectionnez Build path>Configure build path.
  2. dans le menu latéral, sélectionnez Android. Cliquez sur le bouton Ajouter en bas à droite de la fenêtre et sélectionnez captureActivity à partir de la fenêtre.
  3. C'est tout, votre projet est maintenant capable D'utiliser ZXing comme une bibliothèque indépendante sans avoir besoin de installation de fête.

ajouter les méthodes de ZXing exigées par votre demande

Cette partie n'est pas vraiment un guide, mais simplement ce que j'ai trouvé utile pour mes besoins propres, jusqu'à présent, les deux méthodes sont principalement celles-ci:

exécuter 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);

extraire les résultats du scan 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 l'activité de capture android doivent également être définis dans le Manifeste du projet, notez également que vous devez donner au projet l'autorisation d'utiliser la caméra 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 d'autres personnes à épargner quelques bonnes heures de recherche.

en bonus je recommande la lecture : https://biocram.wordpress.com/2013/06/11/integrate-zxing-as-a-library-inside-an-android-project/

42
répondu Liran Cohen 2015-04-23 08:49:37

comme toutes les réponses que j'ai trouvées jusqu'à présent sont basées sur Eclipse et sont assez datées à partir de Maintenant, j'ajoute ma réponse pour ajouter ZXing comme une bibliothèque autonome sur Android Studio (2.1.2).

j'ai mis le projet compilé sur Github https://github.com/tarun0/ZXing-Standalone-library il suffit d'ajouter le module zxing_standalone dans votre projet et vous serez bon pour aller. Pour plus de détails ou pour le compiler pour les nouvelles versions, continuez à lire.

il peut sembler procédure longue, mais une fois que vous passez par elle, vous 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 à partir de celui-ci. Donc, si vous avez déjà ce dossier, vous n'avez pas besoin de télécharger l'ensemble de la branche qui est d'environ 126MO de taille.
  2. télécharger le dernier core-x.x.x.jar de http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1 /
  3. Ajouter le projet android dans votre propre projet. Pour ce faire, choisissez d'abord le Project du Project Explorer (se référer à l'image)

enter image description here

  1. cliquez maintenant sur votre projet, puis cliquez avec le bouton droit de la souris et sélectionnez New > Module > Import Gradle Project . Maintenant, sélectionnez le répertoire android à partir du code source téléchargé (à l'étape 1). (Voir le pic ci-dessous pour le novice absolu). Optionnellement, changez le nom et laissez les paramètres par défaut pour l'importation. enter image description here
  2. dans ce projet importé, faites un dossier libs et mettez le fichier core.jar téléchargé à l'étape 2 dans ce dossier. Puis ouvrez Project Structure à partir du menu fichier et ajoutez ce fichier core.jar comme un dépendance.

enter image description here In step 2 Select <codeAdd file dependency</code

  1. Télécharger CameraConfigurationalUtils.java et coller dans le projet. enter image description here

  2. apporter quelques modifications au Grad du projet importé fichier. Changez le apply plugin: 'com.android.application' en apply plugin: 'com.android.library' pour dire au système que c'est une bibliothèque. Et supprimer la mention applicationId ... .

  3. dans le fichier Manifest.xml du projet importé, faire les modifications suivantes. Dans la balise <application... , supprimez les android:icon... et android:logo... et supprimez ce <category android:name="android.intent.category.LAUNCHER"/> du filtre d'intention car il s'agit d'une bibliothèque maintenant et n'est pas censé être sur le lanceur (si vous ne retirez pas cela, vous finirez par avoir deux lanceur d'activités).

  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. Synchroniser et nettoyer le projet. Vous verrez des erreurs dans les déclarations switch . Cliquez sur ces cas de commutateur et sélectionnez l'option replace with if option fournie par Android Studio.

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

pour utiliser la bibliothèque ajoutée, il suffit d'utiliser le Intents comme indiqué dans la toute première réponse ci-dessus (copier les mêmes codes seulement):

lors de la numérisation (comme en cliquant sur un bouton), Envoyer 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);

puis, 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 les gens le trouvent utile.

s'il vous plaît lire cette réponse par 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/29818279 https://stackoverflow.com/a/29960361 Et quelques autres blogs/réponses.

38
répondu T.M 2017-05-23 11:47:31

Je ne sais pas pourquoi c'est arrivé, mais finalement j'utilise une autre bibliothèque. J'utilise ZXing-android-minimal et tutoriel de ici et ici . Maintenant, il fonctionne.

27
répondu stackex 2017-05-23 12:34:48

je suis vraiment en retard mais je souhaite répondre à cela pour quelqu'un d'autre d'être 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 ainsi, pour le développeur qu'il/elle choisira la meilleure façon. Il est bon d'avoir mille façons d'aller que d'en avoir une.

donc, commençons dans notre Grad et ajoutons

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

appelant le module comme (par exemple: on clique sur le 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();

obtenir 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

13
répondu Ishimwe Aubain Consolateur 2017-08-02 14:02:37

si vous avez de la difficulté à trouver le bocal comme moi, voici L'URL:

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

3
répondu Julián Vega 2015-10-20 13:40:55

l'Élaboration de stackex de réponse.... Créer une activité avec n'importe quel nom.

public class CaptureActivityAnyOrientation extends CaptureActivity {
}

dans le manifeste définir l'orientation désirée ou laisser comme ci-dessous pour travailler à la fois dans le paysage et le portait.

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

enfin utiliser l'activité créée comme setCaptureActivity.

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

Espérons que cette aide.

2
répondu Sachet Bajracharya 2016-03-17 05:33:16

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

2
répondu Perry 2016-11-15 09:03:12

Voici une façon qui fonctionne sur eclipse:

ZXing intégration sur eclipse android app

bonne intégration !

0
répondu Hubert Solecki 2017-05-23 12:10:42