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é?
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.
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:
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
Importation du projet ZXing dans Eclipse
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
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
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/
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.
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.core-x.x.x.jar
De http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/Project
dans le Project Explorer
(Reportez-vous à l’image).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. 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.Téléchargez CameraConfigurationalUtils.Java et collez-le dans le projet.
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 ...
.
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).
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.
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:
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
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.
Voici une manière qui fonctionne sur Eclipse:
Intégration ZXing sur Eclipse Android app
Bonne intégration!
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.