Integrazione della libreria ZXing direttamente nella mia applicazione Android


141

Sto scrivendo questo per mera disperazione :) Mi è stato assegnato il compito di creare uno scanner di codici a barre autonomo (come prova di concetto) su un telefono Android 1.6.

Per questo ho scoperto la libreria ZXing.

Ho cercato su Google, ho letto gli argomenti correlati qui su StackOverflow, usando il senso comune e così via. Nulla sembrava aver aiutato, e non riesco proprio a fare un buco in questo blocco mentale: /

So che è possibile, usare la lib e creare il tuo scanner di codici a barre autonomo. Ho letto che l'uso dello "Scanner di codici a barre" fornito dalla gente di Zxing è di gran lunga la soluzione più semplice (tramite Intent). Sfortunatamente questa non è un'opzione e si desidera un'app standalone.

Quindi per riassumere il mio problema:

  1. Come integrare la libreria di sorgenti ZXing nel mio progetto Android Code tramite Eclipse?
  2. Quando integrato ... come utilizzare la lib, per "caricare" la funzione di scansione?
  3. Una guida passo-passo è quasi preferita perché ho appena iniziato a lavorare in Eclipse.

Ho provato a rendere il mio progetto di codice dipendente dalla cartella Android dalla cartella sorgente ZXing. Quando lo faccio, emergono una manciata di errori, per lo più riguardanti 'org.apache' (??)

Non riesco proprio a capirlo ... quindi alcuni suggerimenti sarebbero di grande aiuto.

In anticipo, grazie :)


Credo che quello che volevi fare si trovi qui: stackoverflow.com/questions/4854442/…
Danny Remington - OMS

ZXing non è l'unico modo per leggere un codice a barre. A partire dal 2016, è molto più semplice utilizzare l' API per codici a barre Android .
Dan Dascalescu,

Risposte:


127

AGGIORNARE! - RISOLTO + GUIDA

Sono riuscito a capirlo :) E in basso puoi leggere la guida passo-passo in modo che possa aiutare gli altri con lo stesso problema che avevo;)

  1. Installa Apache Ant - ( Vedi questo video di YouTube per aiuto sulla configurazione )
  2. Scarica la fonte ZXing dalla homepage di ZXing ed estraila
  3. Con l'uso della riga di comando di Windows (Esegui-> CMD) vai alla directory principale del file scaricato zxing src.
  4. Nella finestra della riga di comando - Digita ant -f core/build.xmlpremi invio e lascia che Apache funzioni magicamente [ hai problemi? ]
  5. Inserisci Eclipse -> nuovo progetto Android, basato sulla cartella Android nella directory che hai appena estratto
  6. Fare clic con il tasto destro del mouse sulla cartella del progetto -> Proprietà -> Percorso build Java -> Libreria -> Aggiungi JAR esterni ...
  7. Passa alla cartella appena estratta e apri la directory principale e seleziona core.jar... premi invio!

Ora devi solo correggere alcuni errori nelle traduzioni e nel file AndroidManifest.xml :) Ora puoi compilare felicemente e ora avrai un'app di scanner di codici a barre autonoma funzionante, basata sull'origine ZXing;)

Felice ragazzi di programmazione - spero che possa aiutare gli altri :)


Grande riscrittura! Puoi aggiungere qualche dettaglio su ciò che hai modificato nel AndroidManifest.xmlfile? Non vedo alcun errore in quel file al momento dell'esame. Grazie!
Brian Armstrong,

7
Non ci sono errori nel file AndroidManifest.xml né nelle traduzioni. Tuttavia, ci sono problemi di compatibilità nell'ultimo Android SDK. Se lo usi devi usare il codice sorgente successivo da SVN.
Sean Owen,

Ciao, stavo cercando di sviluppare un'altra applicazione per la scansione QR come app autonoma senza utilizzare nessuna app QR Droid o Barcode Scanner. I passaggi che hai citato per farlo o stai ancora usando qualche altra app tramite intenti o altro?
Kumar,

1
Il pacchetto zip da code.google.com/p/zxing/downloads/list contiene la directory "core", nonché "android" e "integrazione-android". Qual è il motivo per cui hai usato "core"?
Michał K,

1
Bene, ora so perché. Se qualcuno si chiedeva anche questo, vedi stackoverflow.com/questions/4854442/…
Michał K

83

Ecco una guida dettagliata su come generare e visualizzare il codice QR utilizzando la libreria ZXing senza dover installare l'applicazione di terze parti. Nota: non è necessario creare ZXing con ANT o altri strumenti di compilazione. Il file core.jarè disponibile nell'archivio zip rilasciato (leggi sotto).

  1. Scarica l' ultima versione di ZXing . - ( ZXing-*.zip)
  2. Estrai questo archivio zip e trova core.jarnella core/directory.
  3. Se stai utilizzando Eclipse IDE, trascina e rilascia core.jarnella libsdirectory del tuo progetto Android. Quando richiesto, selezionare Copia .
  4. Copia le due classi indicate di seguito ( Contents.java& QRCodeEncoder.java) nel pacchetto principale del tuo progetto Android.
  5. Crea un ImageViewelemento nella tua attività per visualizzare il codice QR generato se non ne hai già uno. Un esempio è dato seguito:
  6. Utilizza lo snippet di codice seguente per generare il codice QR in formato Bitmap e visualizzarlo in un ImageView.

Ecco un ImageViewelemento da aggiungere al file XML del layout dell'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();
}

Qui è 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();
    }
}

13
L'ultimo ZXing non ha core.jar lì per qualche motivo. Ho dovuto scaricare 2.1 per questo.
capcom,

12
core.jar è disponibile separatamente nel repository della versione Maven, per la versione 2.2 il link è repo1.maven.org/maven2/com/google/zxing/core/2.2/core-2.2.jar
Nantoka


1
Il metodo encodeAsBitmap () restituisce null se non modificato o ha esito negativo con NullPointerException se commento la riga che restituisce null. Sono nuovo di questa biblioteca. Che cosa sto facendo di sbagliato?
KG6ZVP,

2
@Wesam, è stato davvero utile. Ma puoi anche fornire il codice, dove può essere fatto il contrario. Voglio dire, convertire il codice QR nella stringa?
Shaon Hasan,

15

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 collegamento qui: https://github.com/journeyapps/zxing-android-embedded


1
Questa risposta è sminuita dalle altre risposte qui. La maggior parte con schermate e simili. È un peccato perché questa è l'unica risposta che funziona davvero! Presta attenzione a questo. Quello che non ha menzionato è che il progetto collegato è un ramo in cui qualcuno ha trasformato questa libreria difficile in una libreria facile (ed effettivamente facile) da usare. Basta scaricare il core jar dal normale progetto ZXING e il gioco è fatto. Ha anche degli esempi !!!!
StarWind0

1
Vorrei poter dare più voti. Non hai idea di quante volte ho provato a capirlo su diversi progetti nel corso degli anni.
StarWind0

1
Sono felice di servire ragazzi :)
Karoly,

11

Problemi con la creazione di ANT? Continua a leggere

Se ant -f core/build.xml dice qualcosa del tipo:

Unable to locate tools.jar. Expected to find it in
C:\Program Files\Java\jre6\lib\tools.jar

quindi imposta la JAVA_HOMEvariabile di ambiente sulla cartella java corretta. Ho trovato tools.jar nel mio (per Windows):

C:\Program Files\Java\jdk1.6.0_21\lib

quindi ho impostato il mio JAVA_HOMEsu:

C:\Progra~1\Java\jdk1.6.0_25

il motivo della sintassi più breve che ho trovato in qualche sito che dice:

"Si consiglia vivamente di scegliere una directory di installazione che non includa spazi nel nome del percorso (ad esempio, NON installare in C: \ Programmi). Se Java è installato in tale directory, è fondamentale impostare JAVA_HOME variabile di ambiente in un percorso che non include spazi (ad esempio, C: \ Progra ~ 1); in caso contrario, si genereranno eccezioni generate da alcuni programmi che dipendono dal valore di JAVA_HOME. "

Ho quindi riavviato cmd (importante perché la shell DOS legge solo env al momento del lancio, quindi la modifica di una var env richiederà di utilizzare una nuova shell per ottenere il valore aggiornato)

e infine ha ant -f core/build.xmlfunzionato.


11

Poiché alcune delle risposte sono obsolete, vorrei fornire le mie -

Per integrare la libreria ZXing nella tua app Android come suggerito dal loro Wiki , devi aggiungere 2 file Java al tuo progetto:

Quindi in Android Studio aggiungi la seguente riga al file build.gradle :

dependencies {
    ....
    compile 'com.google.zxing:core:3.2.1'
}

O se stai ancora usando Eclipse con il plugin ADT aggiungi il file core.jar alla sottodirectory libs del tuo progetto (qui Windows a schermo intero e Mac a schermo intero ):

Schermata di Windows

Infine aggiungi questo 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'app risultante chiederà di installare e avviare l' app Scanner di codici a barre tramite ZXing (che tornerà automaticamente alla tua app dopo la scansione):

App per scanner di codici a barre

Inoltre, se desideri creare ed eseguire l' app ZXing Test come ispirazione per la tua app:

ZXing Test app

Quindi hai bisogno di 4 file Java da GitHub :

  • BenchmarkActivity.java
  • BenchmarkAsyncTask.java
  • BenchmarkItem.java
  • ZXingTestActivity.java

E 3 file Jar dal repository Maven :

  • core.jar
  • Android-core.jar
  • Android-integration.jar

(Puoi creare tu stesso i file Jar mvn package- se dai un'occhiata a ZXing da GitHub e installi gli strumenti ant e maven sul tuo computer).

Nota: se il progetto non riconosce i file Jar, potrebbe essere necessario aggiornare la versione Java nelle Proprietà del progetto:

screenshot delle proprietà


2
Questa è una risposta fantastica!
Paresh Mayani,

3
Temo che questo abbia mancato il punto della domanda :-( Il punto era non fare affidamento su un'applicazione esterna. Questo mostra come .. usare un'applicazione esterna? Vedi il titolo della domanda "direttamente in"
StarWind0

5

Mettere

compile 'com.google.zxing:core:2.3.0' 

nelle tue dipendenze Gradle. Facile come quello. Prima di utilizzare Android Studio e il sistema di build Gradle.


Destra! Questa è la vera soluzione nel 2015. Btw. la versione attuale è 3.2.0
funcoder

ha funzionato per chiunque? IntentIntegrator non è stato ancora trovato
Karoly

È necessario copiare manualmente i file IntentIntegrator.java e IntentResult.java nel progetto Android Studio.
Alexander Farber,



2

Passo dopo passo per installare zxing 3.2.1 in eclipse

  1. Scarica zxing-master.zip da " https://github.com/zxing/zxing "
  2. Decomprimi zxing-master.zip, Usa eclipse per importare il progetto "android" in zxing-master
  3. Scarica core-3.2.1.jar da " http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ "
  4. Crea la cartella "libs" nel progetto "android" e incolla cor-3.2.1.jar nella cartella libs
  5. Fai clic sul progetto: scegli "proprietà" -> "Java Compiler" per cambiare il livello in 1.7. Quindi fai clic su "Android" cambia "Progetto obiettivo di costruzione" su Android 4.4.2+, perché l'utilizzo di 1.7 richiede la compilazione con Android 4.4
  6. Se "CameraConfigurationUtils.java" non esiste in "zxing-master / android / app / src / main / java / com / google / zxing / client / android / camera /". Puoi copiarlo da "zxing-master / android-core / src / main / java / com / google / zxing / client / android / camera /" e incollarlo nel tuo progetto.
  7. Pulisci e costruisci progetto. Se il tuo progetto mostra errori su "switch - case", dovresti cambiarli in "if - else".
  8. Completato. Pulisci e costruisci progetto.
  9. Link di riferimento: utilizzo di ZXing per creare un'app di scansione di codici a barre Android

2

Ho provato tutti i modi possibili per raggiungere questo obiettivo e poi ho scoperto la versione ridotta di xZing di JourneyApps. L'ho portato per eclissi e condiviso su GitHub.

Se stai usando eclipse usa questo progetto: -

https://github.com/hiteshsahu/XZing-Barcode-Scanner-Minified-Eclipse

Se stai usando Studio usa questo progetto: -

https://github.com/journeyapps/zxing-android-embedded

vantaggi

  1. Lo scanner di codici a barre integrato nella tua app non è necessario per installare app di terze parti tramite Playstore.

  2. Non è necessario confondersi tra i barattoli Core, client Android ecc. Semplicemente rilasciare questi pacchetti e layout pertinenti nel progetto e si è pronti per partire. È richiesto solo Jar. Com.google.zxing: core: 3.2.0 da cui è possibile scaricare

    http://mvnrepository.com/artifact/com.google.zxing/core/3.2.0

  3. Non è necessario aggiungere tonnellate di pacchetti, vedere le immagini di seguito per un confronto

Prima :-

inserisci qui la descrizione dell'immagine

Dopo :-

inserisci qui la descrizione dell'immagine

  1. La parte più importante è che sono altamente personalizzabili cioè. puoi aggiungere la luce del flash, usarla in frammenti e supportare il cambio di orientamento.

  2. È possibile utilizzare questa attività di acquisizione nell'app Cordova per la scansione dei codici a barre.

la tua attività di acquisizione in manifest app sarebbe simile a questa

  <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 il plugin sarà simile a questo

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");
            }
        }
    }
}

Buona integrazione !!


2

I ragazzi di zxing hanno reso più semplice la creazione di un progetto Android con 1.7. Non è più doloroso come una volta. Questo è un blog veloce per chiunque desideri creare rapidamente un progetto zxing per Android.

  • Dai un'occhiata alle fonti di zxing da zxing.org
  • Crea un progetto Android sulla tua eclissi
  • Elimina main.xml
  • Fare clic con il tasto destro sulla directory "src" e premere import. Passare alle seguenti directory nell'ordine indicato. Quando li aggiungi per l'importazione uno per uno, assicurati di avere la directory src nel campo di modifica della procedura guidata di importazione. E che selezioni solo la directory "com" nella struttura di directory a sinistra. Non selezionare src.
  • nucleo
  • Android-integrazione
  • androide
  • Assicurati che la tua versione di Android SDK sia 9, qualsiasi cosa minore e androidmanifest.xml piangerà.
  • Strings.xml in una delle lingue verrà crib, basta mettere un / prima del carattere

Un progetto Android per zxing 1.7 (checkout del 20 giugno).

http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html ( NON DISPONIBILE ANCORA )


2

Perché usare una libreria esterna, quando i servizi di riproduzione di Google (dalla versione 7.8.0 ) includono un decodificatore di codice a barre.


1
Non è possibile installare i servizi di Google Play in Cina, perché Google è bloccato.
Xiè Jìléi,

Se hai installato Google Play Services per fortuna, non puoi ancora utilizzarlo in Cina, perché Google è bloccato.
Xiè Jìléi,

2

Ho appena scritto un metodo che decodifica i codici Bitmapa barre generati in String.

Fa esattamente ciò che viene richiesto, solo senza il CaptureActivity...

Pertanto, è possibile saltare la android-integrationlibreria in 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 in realtà decodifica i codici a barre generati, 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;
}


0

Recentemente ho usato google mobile vision sia su iOS che su Android. Consiglio vivamente di utilizzare Google Barcode Scan. È piuttosto reattivo con qualsiasi orientamento e il tempo di elaborazione è piuttosto veloce. Si chiama Google Mobile Vision.

L'API Scanner di codici a barre rileva i codici a barre in tempo reale con qualsiasi orientamento. È inoltre possibile rilevare e analizzare contemporaneamente più codici a barre in diversi formati.

https://developers.google.com/vision/

https://codelabs.developers.google.com/codelabs/bar-codes/#0


0

Approccio molto più semplice.

Includi solo la dipendenza nel file di valutazione a livello di app

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

Definisci un pulsante nel tuo file xml e scrivi sotto il codice nel file Java in OnCreate () e all'interno del listener OnClick del pulsante

new IntentIntegrator(this).initiateScan();

E scrivi sotto il 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();

        }
    }

}

st_scanned_resultnon è definito qui
kelalaka

Questa è una variabile globale di tipo String. Se non stai utilizzando il risultato scansionato al di fuori di questo onActivtyResult (), puoi definirlo localmente. Come stringa st_scanned_result = result.getContents (); L'ho aggiornato per favore.
Tara,

0

AGGIORNAMENTO 2020: basta aggiungere questo al tuo file Gradle. Funziona perfettamente!

repositories {
   jcenter()
}
implementation 'me.dm7.barcodescanner:zxing:1.9.13'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.