Integrando la libreria ZXing direttamente nella mia applicazione Android
-
23-10-2019 - |
Domanda
Sto scrivendo questo nella mera disperazione :) Sono stato assegnato a fare uno scanner di codici a barre standalone (come un proof of concept) per un telefono Android 1.6.
Per questo ho scoperto la libreria ZXing.
Googled, leggere argomenti correlati qui su StackOverflow usati sence comune e così via. Niente sembrava di aver aiutato, e non riesco proprio a fare un buco su questo blocco mentale: /
Lo so che sia possibile, di utilizzare il lib, e creare il proprio scanner standalone di codici a barre. Ho letto che utilizzando il "Barcode Scanner" fornita dalla gente ZXing, è di gran lunga la soluzione più semplice (via Intent). Purtroppo questo non è un'opzione, e un'applicazione stand-alone è voluta.
Quindi, per riassumere il mio problema:
- Come integrare ZXing fonte lib nel mio progetto di codice di Android attraverso Eclipse?
- Se integrato ... come fare uso del lib, per "caricare" la funzione di scansione?
- Un passo per passo guida è quasi preferiva perché ho appena iniziato a lavorare in Eclipse.
ho cercato di fare il mio progetto di codice dipendente della cartella Android dalla cartella di origine ZXing. Quando lo faccio, a errori manciata emergono, che riguardano per lo piu 'org.apache' (??)
non riesco proprio a capirlo ... quindi alcuni suggerimenti sarebbe più utile.
In anticipo, grazie:)
Soluzione
UPDATE! - Risolto + GUIDE
Sono riuscito a capirlo :) E giù in basso si può leggere la guida passo-passo in modo che si spera possa aiutare gli altri con lo stesso problema, come ho avuto;)
- Installa Apache Ant - ( Vedi questo video su YouTube per config aiuto )
- Scarica la fonte ZXing da ZXing homepage e estrarlo
- Con l'uso di di Windows Commandline (Run-> CMD) Passare alla directory principale del
zxing src
scaricato. - Nella finestra di comando - Tipo
ant -f core/build.xml
premere invio e lasciare il lavoro Apache è magia [ avendo problemi? ] - Inserisci Eclipse -> Nuovo progetto Android, in base alla cartella di Android nella directory appena estratta ??li>
- cartella di progetto pulsante destro del mouse -> Proprietà -> Java Build Path -> Libreria -> Aggiungi JAR esterni ...
- Passare alla cartella appena estratta e aprire la directory principale e selezionare
core.jar
... premi invio!
Ora devi solo per correggere alcuni errori nelle traduzioni e il file di AndroidManifest.xml :) Ora si può tranquillamente compilare, e si avranno ora un'applicazione barcode scanner stand-alone di lavoro, in base alla sorgente ZXing;)
ragazzi Felice di codifica - spero che possa aiutare gli altri:)
Altri suggerimenti
Ecco una guida passo-passo su come generare e codice di visualizzazione a barre usando la libreria ZXing senza dover installare l'applicazione di terze parti. Nota: non c'è bisogno di costruire ZXing con ANT o qualsiasi altro strumento di compilazione. Il file core.jar
è disponibile in archivio zip rilasciato (leggi sotto).
- ZXing . - (
ZXing-*.zip
) - Estrai questo archivio zip e trovare
core.jar
sotto directorycore/
. - Se si utilizza Eclipse IDE, drag and drop
core.jar
alla directorylibs
del progetto Android. Quando è stato chiesto, selezionare Copia . - Copia le due classi riportata qui sotto (
Contents.java
&QRCodeEncoder.java
) al pacchetto principale del progetto Android. - Creare un elemento
ImageView
nella vostra attività per visualizzare il codice QR generato in se non ne hai già uno. Un esempio è il seguente: - Utilizza il frammento di codice seguente per generare il codice QR in formato bitmap e visualizzarla in un
ImageView
.
Ecco un elemento ImageView
da aggiungere al vostro file di layout XML attività:
<ImageView
android:id="@+id/qrCode"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="50dp"
android:layout_centerHorizontal="true"/>
Snippet di codice:
// 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();
}
Ecco 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
};
}
E 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();
}
}
Il
compile 'com.google.zxing:core:2.3.0'
purtroppo non ha funzionato per me.
Questo è ciò che ha funzionato per me:
dependencies {
compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
compile 'com.google.zxing:core:3.2.0'
}
Si prega di trovare il link qui: https://github.com/journeyapps/zxing-android-embedded
Avere problemi di edificio con ANT? Continua a leggere
Se ant -f core/build.xml
dice qualcosa come:
Unable to locate tools.jar. Expected to find it in
C:\Program Files\Java\jre6\lib\tools.jar
quindi impostare la variabile d'ambiente JAVA_HOME
alla cartella java corretta. Ho trovato tools.jar nel mio (per Windows):
C:\Program Files\Java\jdk1.6.0_21\lib
così ho impostato il mio JAVA_HOME
a:
C:\Progra~1\Java\jdk1.6.0_25
la ragione per la sintassi più breve ho trovato su qualche sito che dice:
"E 'fortemente consigliato che si scegliere una directory di installazione che non include spazi nel percorso Nome (ad esempio, non installare in C: \ Program Files). Se Java è installato in tale directory A, è fondamentale per impostare la JAVA_HOME ambiente variabile a un percorso che non include spazi (ad esempio, C: \ Progra ~ 1); in caso contrario tale volontà comportare eccezioni sollevate da alcuni programmi che dipendono dal valore di JAVA_HOME ".
I cmd poi rilanciati (importante perché DOS shell legge solo env vars su lancio, in modo da cambiare un env var richiederà di utilizzare una nuova shell per ottenere il valore aggiornato)
ed infine il ant -f core/build.xml
ha funzionato.
Dal momento che alcune delle risposte sono obsoleti, vorrei offrire il mio -
Per integrare libreria ZXing nella vostra app Android come suggerito da loro Wiki , è necessario aggiungere 2 file Java al progetto:
Poi nel Android Studio aggiungere la seguente riga a build.gradle file:
dependencies {
....
compile 'com.google.zxing:core:3.2.1'
}
Se ancora utilizzando Eclipse con ADT-plugin core.jar il file al libs sottodirectory del vostro progetto (qui fullscreen di Windows e fullscreen Mac ):
Infine aggiungere il codice al tuo 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'applicazione risultante chiederà di installare e avviare Barcode Scanner app ZXing (che tornerà per la vostra applicazione automaticamente dopo la scansione):
Inoltre, se si desidera creare ed eseguire il ZXing Test App come ispirazione per il proprio app:
Allora avete bisogno di 4 file Java da GitHub :
- BenchmarkActivity.java
- BenchmarkAsyncTask.java
- BenchmarkItem.java
- ZXingTestActivity.java
e 3 file JAR dalla Maven repository :
- core.jar
- Android-core.jar
- Android-integration.jar
(È possibile creare i file Jar te stesso con mvn package
- se il vostro check-out ZXing da GitHub e installare ant e Maven strumenti a computer).
Nota: se il progetto non riconosce i file JAR, potrebbe essere necessario la versione Java nelle proprietà del progetto:
Avete visto le href="http://code.google.com/p/zxing/w/list" rel="nofollow"> wiki pagine sul sito ZXing? Sembra che si potrebbe trovare GettingStarted , DeveloperNotes e ScanningViaIntent utile.
Mettere
compile 'com.google.zxing:core:2.3.0'
nelle vostre dipendenze Gradle. Facile come quello. Prima di utilizzare Android Studio e sistema di compilazione Gradle.
Se avete solo bisogno il core.jar da ZXing, è possibile saltare questo processo e ottenere i JAR pre-costruiti dal pagina wiki GettingStarted
Ultimi ZXing (2.2) non ha core.jar nella cartella di base, ma è possibile ottenere il core.jar dal ZXing Maven repository qui
Passo dopo passo per l'installazione ZXing 3.2.1 in Eclipse
- Scarica zxing-master.zip da " https://github.com/zxing/zxing "
- Unzip zxing-master.zip, utilizzare Eclipse per importare "Android" progetto in ZXing-master
- Scarica core-3.2.1.jar da " http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ "
- Creare "libs" cartella nel progetto "Android" e incollare cor-3.2.1.jar nella cartella libs
- Fare clic sul progetto: scegliete "Proprietà" -> "Java Compiler" al livello del cambio a 1,7. Poi clicca su "Android" cambiamento "build target Progetto" ad Android 4.4.2+, perché l'utilizzo di 1.7 richiede la compilazione con Android 4.4
- Se "CameraConfigurationUtils.java" non esistono in "ZXing-master / android / app / src / main / java / com / google / ZXing / client / android / videocamera /". È possibile copiare da "ZXing-master / android-core / src / main / java / com / google / ZXing / client / android / videocamera /" e incollare al vostro progetto.
- Pulire e del progetto di costruzione. Se il vostro show errore del progetto di "switch - caso", li si dovrebbe cambiare in "se - altro".
- Completato. Pulire e costruzione del progetto. Link
- Riferimento: Utilizzando ZXing per creare un androide di codici a barre di scansione app
Ho provato tutti i possibili modi per raggiungere questo e poi ho scoperto la versione minified di xZing da JourneyApps. Ho portato che per Eclipse e condiviso su GitHub.
Se si utilizza utilizzare Eclipse questo progetto: -
https://github.com/hiteshsahu/XZing-Barcode-Scanner -Minified-Eclipse
Se si utilizza Studio utilizzare questo progetto: -
https://github.com/journeyapps/zxing-android-embedded
Vantaggi
-
scanner per codici a barre Inbuilt nella vostra App non richiesto per installare applicazioni di terze parti utilizzando playstore.
-
Non avete bisogno di confondersi tra core, client Android ecc vasetti semplicemente cadere questo pacchetti e layout pertinenti ripresi nel progetto e vi sono buone per andare. Solo JAR richiesto è com.google.zxing: nucleo: 3.2.0 che può essere scaricato da
http://mvnrepository.com/artifact/com.google .zxing / core / 3.2.0
-
Non c'è bisogno di aggiungere tonnellate di pacchetti vedi immagini qui sotto per il confronto
Prima: -
Dopo: -
-
La maggior parte parte importante è che sono altamente personalizzabile per esempio. è possibile aggiungere luce del flash, utilizzarlo in frammento e l'orientamento cambia il supporto.
-
È possibile utilizzare questa attività di cattura in Cordova app per il codice a barre scanneing.
l'attività di cattura in file manifest sarebbe simile a questa ??p>
<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>
e plug-in sarà simile a questa ??p>
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");
}
}
}
}
Happy Integrazione !!
I ragazzi ZXing hanno reso più facile per creare un progetto Android con 1.7. La sua non è doloroso come ha usato essere. Questo un breve blog per tutti coloro che vogliono creare un progetto ZXing per Android rapidamente.
- Acquista fonti ZXing da zxing.org
- Creare un progetto Android sul vostro Eclipse
- main.xml Elimina
- Fare clic destro durante l'importazione “src” directory e successo. Individuare le seguenti directory nell'ordine citato. Come li si aggiunge per un'importazione per uno, assicurarsi di avere la directory src nel campo di modifica della procedura guidata di importazione. E di selezionare solo il “com” directory sulla directory sinistra. Non selezionare src.
- nucleo
- Android-integrazione
- Android
- Assicuratevi che il vostro Android SDK è 9, nulla di meno e AndroidManifest.xml piangerà.
- strings.xml in una delle lingue si culla, basta mettere un / prima che il ‘carattere
Un progetto Android per ZXing 1.7 (20 giugno-out).
http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010 .html ( non più disponibile )
Perché utilizzare un lib esterna, quando Google Play Services (a partire dalla versione 7.8.0 ) include un decodificatore di codici a barre.
Ho appena scritto un metodo, che decodifica generato codici a barre, Bitmap
a String
.
Si fa esattamente ciò che viene richiesto, solo senza il CaptureActivity
...
Pertanto, si può saltare la biblioteca android-integration
nella 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')
}
Il metodo come segue (che decodifica effettivamente prodotte codici a barre, all'interno di 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;
}
Di recente ho utilizzato Google visione mobile sia per iOS e Android. Consiglio vivamente di utilizzare Google Barcode Scan. E 'abbastanza reattivo con qualsiasi orientamento e il tempo di elaborazione è abbastanza veloce. Si chiama Google Mobile Vision.
L'API Barcode Scanner rileva i codici a barre in tempo reale in qualsiasi orientamento. È inoltre possibile rilevare e analizzare diversi codici a barre in diversi formati allo stesso tempo.
https://developers.google.com/vision/
https://codelabs.developers.google.com/codelabs/ codici a barre / # 0
approccio molto più facile.
Proprio includere la dipendenza nella vostra applicazione file di livello Gradle
compile 'com.journeyapps:zxing-android-embedded:3.0.1@aar'
compile 'com.google.zxing:core:3.2.0'
Definire un tasto nel file XML e di scrittura e di seguito il codice nel file di Java in OnCreate () e dentro l'ascoltatore Su clic del pulsante
new IntentIntegrator(this).initiateScan();
e scrivere sotto codice dopo OnCreate () del file 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();
}
}
}