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:

  1. Come integrare ZXing fonte lib nel mio progetto di codice di Android attraverso Eclipse?
  2. Se integrato ... come fare uso del lib, per "caricare" la funzione di scansione?
  3. 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:)

È stato utile?

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

  1. Installa Apache Ant - ( Vedi questo video su YouTube per config aiuto )
  2. Scarica la fonte ZXing da ZXing homepage e estrarlo
  3. Con l'uso di di Windows Commandline (Run-> CMD) Passare alla directory principale del zxing src scaricato.
  4. Nella finestra di comando - Tipo ant -f core/build.xml premere invio e lasciare il lavoro Apache è magia [ avendo problemi? ]
  5. Inserisci Eclipse -> Nuovo progetto Android, in base alla cartella di Android nella directory appena estratta
  6. cartella di progetto pulsante destro del mouse -> Proprietà -> Java Build Path -> Libreria -> Aggiungi JAR esterni ...
  7. 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).

  1. ZXing . - (ZXing-*.zip)
  2. Estrai questo archivio zip e trovare core.jar sotto directory core/.
  3. Se si utilizza Eclipse IDE, drag and drop core.jar alla directory libs del progetto Android. Quando è stato chiesto, selezionare Copia .
  4. Copia le due classi riportata qui sotto (Contents.java & QRCodeEncoder.java) al pacchetto principale del progetto Android.
  5. Creare un elemento ImageView nella vostra attività per visualizzare il codice QR generato in se non ne hai già uno. Un esempio è il seguente:
  6. 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 ):

Windows screenshot

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):

Barcode Scanner app

Inoltre, se si desidera creare ed eseguire il ZXing Test App come ispirazione per il proprio app:

ZXing Test 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:

proprietà Screenshot

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

  1. Scarica zxing-master.zip da " https://github.com/zxing/zxing "
  2. Unzip zxing-master.zip, utilizzare Eclipse per importare "Android" progetto in ZXing-master
  3. Scarica core-3.2.1.jar da " http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ "
  4. Creare "libs" cartella nel progetto "Android" e incollare cor-3.2.1.jar nella cartella libs
  5. 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
  6. 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.
  7. Pulire e del progetto di costruzione. Se il vostro show errore del progetto di "switch - caso", li si dovrebbe cambiare in "se - altro".
  8. Completato. Pulire e costruzione del progetto.
  9. Link
  10. 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

  1. scanner per codici a barre Inbuilt nella vostra App non richiesto per installare applicazioni di terze parti utilizzando playstore.

  2. 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

  3. Non c'è bisogno di aggiungere tonnellate di pacchetti vedi immagini qui sotto per il confronto

Prima: -

entrare descrizione dell'immagine qui

Dopo: -

entrare descrizione dell'immagine qui

  1. 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.

  2. È 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

  <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

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();

        }
    }

}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top