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:
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 :)
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;)
zxing src
téléchargé.ant -f core/build.xml
appuyez sur Entrée et laissez Apache travailler, c'est magique [avoir des problèmes?]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 :)
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).
ZXing-*.Zip
)core.jar
dans le répertoire core/
.core.jar
dans le répertoire libs
de votre projet Android. Lorsque vous y êtes invité, sélectionnez Copier .Contents.Java
& QRCodeEncoder.Java
) dans le package principal de votre projet Android.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: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();
}
}
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
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é.
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 ):
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):
De plus, si vous souhaitez créer et exécuter l'application application de test ZXing comme source d'inspiration pour votre propre application:
Ensuite, vous avez besoin de 4 Java fichiers de GitHub :
Et 3 fichiers Jar de référentiel Maven :
(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:
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.
Avez-vous vu le pages wiki sur le site Web zxing? Il semble que vous pourriez trouver GettingStarted , DeveloperNotes et ScanningViaIntent .
Pas à pas pour configurer zxing 3.2.1 dans Eclipse
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.
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.
Un projet Android pour zxing 1.7 (commande du 20 juin).
http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html ( plus disponible )
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
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
Le scanner de codes à barres intégré à votre application ne nécessite pas l'installation d'applications tierces à l'aide de Playstore.
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.
Pas besoin d'ajouter des tonnes de paquets voir les images ci-dessous pour comparaison
Avant :-
Après :-
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.
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 !!
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;
}
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.
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();
}
}
}