Frage

Ich schreibe dies in bloßer Verzweiflung :) Ich wurde zugewiesen, ein eigenständiger Barcode -Scanner (als Proof of Concept) an ein Android 1.6 -Telefon zu machen.

Dafür habe ich die Zxing -Bibliothek entdeckt.

Ich habe gegoogelt, verwandte Themen hier auf Stackoverflow verwendet, die gemeinsame Sachen usw. verwendet haben. Nichts schien geholfen zu haben, und ich kann einfach kein Loch auf diese Mentale -Blockade schlagen:/

Ich weiß, dass es möglich ist, die LIB zu verwenden und einen eigenen eigenständigen Barcode -Scanner zu erstellen. Ich habe gelesen, dass die Verwendung des von den Zxing -Leuten bereitgestellten "Barcode -Scanner" bei weitem die einfachste Lösung ist (über Absicht). Leider ist dies keine Option, und eine eigenständige App ist erwünscht.

Also, um mein Problem zusammenzufassen:

  1. Wie integriere ich Zxing Source Lib in mein Android -Codeprojekt über Eclipse?
  2. Wenn Sie integriert sind, nutzen Sie die LIB, um die Scanfunktion zu "laden"?
  3. Ein Schritt zur Schrittführung wird fast bevorzugt, da ich gerade angefangen habe, in Eclipse zu arbeiten.

Ich habe versucht, mein Codeprojekt vom Android -Ordner aus dem ZXing -Quellordner abhängig zu machen. Wenn ich das tue, tauchen handliche Fehler auf, hauptsächlich in Bezug auf 'org.apache' (??)

Ich kann es einfach nicht herausfinden ... also ein paar Hinweise wären am hilfreichsten.

Im Voraus, danke :)

War es hilfreich?

Lösung

AKTUALISIEREN! - gelöst + Leitfaden

Ich habe es geschafft, es herauszufinden :) und unten können Sie schrittweise Leitfaden lesen, damit es hoffentlich anderen mit dem gleichen Problem helfen kann wie ich;)

  1. APache Ant - (Sehen Sie sich dieses YouTube -Video für Konfigurationshilfe an)
  2. Laden Sie die ZXing -Quelle von ZXing Homepage herunter und extrahieren Sie sie
  3. Navigieren Sie mit der Verwendung von Windows Commandline (Run-> CMD) zum Stammverzeichnis des heruntergeladenen zxing src.
  4. Im Fenster Befehlszeilen - Geben Sie ein ant -f core/build.xml Drücken Sie die Eingabetaste und lassen Sie Apache funktionieren. Es ist Magie [Probleme haben?]
  5. Geben Sie Eclipse -> neues Android -Projekt ein, basierend auf dem Android -Ordner im gerade extrahierten Verzeichnis
  6. Klicken Sie mit der rechten Maustaste -> Eigenschaften -> Java Build -Pfad -> Bibliothek -> Externe Gläser hinzufügen ...
  7. Navigieren Sie zum neu extrahierten Ordner, öffnen Sie das Kernverzeichnis und wählen Sie core.jar ... drücke Enter!

Jetzt müssen Sie nur noch ein paar Fehler in den Übersetzungen und in der Datei androidManifest.xml -Datei korrigieren :) Jetzt können Sie gerne kompilieren, und jetzt haben Sie eine funktionierende eigenständige Barcode -Scanner -App, basierend auf der ZXing -Quelle;)

Happy Coding -Leute - ich hoffe es kann anderen helfen :)

Andere Tipps

Hier finden Sie eine Schritt-für-Schritt-Anleitung zum Generieren und Anzeigen von QR-Code mit der ZXing-Bibliothek, ohne die Anwendung von Drittanbietern installieren zu müssen. Notiz: Sie müssen kein Zxing mit Ameisen oder einem anderen Build -Tool aufbauen. Die Datei core.jar ist im veröffentlichten ZIP -Archiv erhältlich (unten gelesen).

  1. Laden Sie die herunter Neueste Veröffentlichung von Zxing. -- (ZXing-*.zip)
  2. Extrahieren Sie dieses Zip -Archiv und finden Sie core.jar unter core/ Verzeichnis.
  3. Wenn Sie Eclipse IDE verwenden, ziehen Sie und fallen Sie ab core.jar zum libs Verzeichnis Ihres Android -Projekts. Wenn Sie gefragt werden, wählen Sie Kopieren.
  4. Kopieren Sie die beiden unten angegebenen Klassen (Contents.java & QRCodeEncoder.java) zum Hauptpaket Ihres Android -Projekts.
  5. Erstelle ein ImageView Element in Ihrer Aktivität, um den generierten QR -Code anzuzeigen, wenn Sie noch keinen haben. Ein Beispiel ist unten angegeben:
  6. Verwenden Sie den Code -Snippet unten, um den QR -Code im Bitmap -Format zu generieren und in einem anzeigen ImageView.

Hier ist ein ImageView Element, das zu Ihrer Aktivitätslayout XML -Datei hinzugefügt wird:

<ImageView 
    android:id="@+id/qrCode"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="50dp"
    android:layout_centerHorizontal="true"/>

Code-Auszug:

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

Hier ist 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
    };
}

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

Das

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

Leider hat es bei mir nicht funktioniert.

Das hat für mich funktioniert:

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

Bitte finden Sie den Link hier:https://github.com/journeyapps/zxing-android-embedded

Probleme mit der Ameise aufbauen? Weiter lesen

Wenn ant -f core/build.xmlsagt so etwas wie:

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

Dann setzen Sie Ihre JAVA_HOME Umgebungsvariable zum richtigen Java -Ordner. Ich habe Tools.jar in meinem (für Windows) gefunden:

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

Also habe ich meine gesetzt JAVA_HOME zu:

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

Der Grund für die kürzere Syntax, die ich an einer Stelle gefunden habe, die besagt:

"Es wird dringend empfohlen, ein Installationsverzeichnis zu wählen, das keine Leerzeichen in den Pfadnamen enthält (z. B. nicht in C: Programmdateien installiert). Wenn Java in einem solchen Verzeichnis installiert ist, ist es wichtig, das java_home festzulegen Umgebungsvariable zu einem Pfad, der keine Leerzeichen enthält (z. B. C: programm ~ 1); dies führt dies nicht zu Ausnahmen, die von einigen Programmen geworfen werden, die vom Wert von java_home abhängen. "

Ich habe dann CMD neu gestartet (wichtig, weil DOS Shell beim Start nur Env VARs liest. Wenn Sie also eine Env -Var ändern, müssen Sie eine neue Shell verwenden, um den aktualisierten Wert zu erhalten).

und schließlich die ant -f core/build.xml hat funktioniert.

Da einige der Antworten veraltet sind, möchte ich meine eigenen bereitstellen -

Um die ZXing -Bibliothek in Ihre Android -App zu integrieren, wie vorgeschlagen von ihr Wiki, Sie müssen Ihrem Projekt 2 Java -Dateien hinzufügen:

Dann in Android Studio Fügen Sie die folgende Zeile hinzu zu build.gradle Datei:

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

Oder wenn noch verwendet Eclipse mit ADT-Plugin hinzufügen core.jar Datei an der libs Unterverzeichnis Ihres Projekts (hier Vollbildfenster und Vollbildmak):

Windows screenshot

Fügen Sie diesen Code endlich zu Ihrem hinzu 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();
}

Die resultierende App wird nach Installieren und Starten aufgefordert Barcode -Scanner -App von ZXing (Dies kehrt nach dem Scannen automatisch zu Ihrer App zurück):

Barcode Scanner app

Außerdem, wenn Sie die bauen und laufen möchten Zxing -Test App Als Inspiration für Ihre eigene App:

ZXing Test app

Dann benötigen Sie 4 Java -Dateien von Github:

  • BenchmarkActivity.java
  • Benchmarkasynctask.java
  • Benchmarkitem.java
  • ZxingTestactivity.java

Und 3 Glasdateien von Maven Repository:

  • core.jar
  • Android-core.jar
  • Android-Integration.Jar

(Sie können die Jar -Dateien selbst erstellen mvn package - Wenn Sie Zxing von Github und Installation auschecken Ameise und Maven Werkzeuge an Ihrem Computer).

Hinweis: Wenn Ihr Projekt die JAR -Dateien nicht erkennt, müssen Sie möglicherweise die Java -Version in den Projekteigenschaften verbessern:

properties screenshot

Hast du den ... gesehen Wiki -Seiten Auf der Zxing -Website? Es scheint, dass Sie vielleicht finden könnten Einstieg, Entwicklungen und Scanningviaintent hilfreich.

Stellen

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

in Ihre Abhängigkeiten. So einfach das. Vor der Verwendung von Android Studio und Gradle Build System.

Wenn Sie nur den Core.jar von Zxing benötigen, können Sie diesen Prozess überspringen und die vorgefertigten Gläser aus dem erhalten Wiki -Seite erhalten

Die neueste Zxing (2.2) hat keinen Core.jar im Kernordner, aber Sie können den Core.jar aus dem Zxing erhalten Maven Repository hier

Schritt für Schritt zum Einrichten von ZXing 3.2.1 in Sonnenfinsternis

  1. Download Zxing-master.zip von "https://github.com/zxing/zxing"
  2. Unzipe zxing-master.zip, verwenden Eclipse, um das "Android" -Projekt in Zxing-Master zu importieren
  3. Laden Sie Core-3.2.1.jar von "herunter"http://repo1.maven.org/maven2/com/google/zxing/core/2.2.1/"
  4. Erstellen
  5. Klicken Sie auf Projekt: Wählen Sie "Eigenschaften" -> "Java Compiler", um das Niveau auf 1.7 zu ändern. Klicken Sie dann auf "Android" Change "-Projektbuilding" auf Android 4.4.2+, da die Verwendung von 1.7 das Kompilieren mit Android 4.4 erfordert
  6. Wenn "cameraconfigurationutils.java" in "Zxing-Master/Android/App/Src/Main/Java/com/google/zxing/client/android/camera/" nicht vorhanden ist. Sie können es von "ZXING-MASTER/ANDROID-CORE/SRC/Main/Java/com/Google/ZXing/Client/Android/Camera/" kopieren und in Ihr Projekt einfügen.
  7. Projekt reinigen und bauen. Wenn Ihr Projekt Fehler zu "Switch - Fall" anzeigt, sollten Sie sie in "if - sonst" ändern.
  8. Abgeschlossen. Projekt reinigen und bauen.
  9. Referenzlink: Verwenden von ZXING zum Erstellen einer Android -Barcode -Scan -App

Ich habe alle möglichen Möglichkeiten versucht, dies zu erreichen, und dann entdeckte ich eine Minimified -Version von XZing von JourneyApps. Ich habe das für Eclipse portiert und auf Github geteilt.

Wenn Sie Eclipse verwenden, verwenden Sie dieses Projekt:-

https://github.com/hiteshsahu/xzing-barcode-scanner-minified-eclipse

Wenn Sie Studio verwenden, verwenden Sie dieses Projekt:-

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

Vorteile

  1. Der eingebaute Barcode -Scanner in Ihrer App ist nicht erforderlich, um Drittanbieter -Apps über PlayStore zu installieren.

  2. Sie müssen sich nicht zwischen Kern, Android -Kunden usw. verwechseln, die diese Pakete und relevante Layouts in Ihrem Projekt einfach fallen lassen, und Sie können loslegen. Nur ein Glas benötigt ist com.google.zxing: Kern: 3.2.0 von dem Sie herunterladen können

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

  3. Sie müssen keine Tonnen von Paketen hinzufügen Siehe Bilder unten zum Vergleich

Vor :-

enter image description here

Nach :-

enter image description here

  1. Das wichtigste Teil ist, dass sie es sind hoch anpassbar dh. Sie können Flash -Licht hinzufügen, es in Fragment verwenden und die Orientierungsänderung unterstützen.

  2. Sie können diese Erfassungsaktivität in verwenden Cordova App Für Barcode -Scanneing.

Ihre Erfassungsaktivität in App Manifest würde so aussehen

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

Und Plugin wird so aussehen

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

Glückliche Integration !!

Die Zxing -Jungs haben es einfacher gemacht, ein Android -Projekt mit 1.7 zu erstellen. Es ist nicht so schmerzhaft wie früher. Dies ist ein kurzer Blog für alle, die schnell ein ZXing -Projekt für Android erstellen möchten.

  • Checkout der ZXing -Quellen von Zxing.org
  • Erstellen Sie ein Android -Projekt in Ihrer Sonnenfinsternis
  • Main.xml löschen
  • Klicken Sie mit der rechten Maustaste auf das Verzeichnis "SRC" und klicken Sie importieren. Durchsuchen Sie die folgenden Verzeichnisse in der genannten Reihenfolge. Stellen Sie beim Hinzufügen von einzelnen für den Import für den Import ein, dass Sie das SRC -Verzeichnis im Feld Bearbeitungsfeld des Import -Assistenten haben. Und dass Sie nur das Verzeichnis „COM“ im linken Verzeichnisbaum auswählen. Wählen Sie nicht src.
  • Ader
  • Android-Integration
  • Android
  • Stellen Sie sicher, dass Ihre Android SDK -Version 9 ist, alles weniger und AndroidManifest.xml wird weinen.
  • Strings.xml in einer der Sprachen wird krib

Ein Android -Projekt für ZXing 1.7 (20. Juni Kauf).

http://www.4shared.com/file/bfx8y5ys/zxingjune2010.html (NICHT MEHR VERFÜGBAR)

Warum eine externe LIB verwenden, wenn Google Play Services (seit der Version 7.8.0) Beinhaltet einen Barcode -Decoder.

Ich habe gerade eine Methode geschrieben, die decodiert, die Bar-Codes erzeugt haben, Bitmap zu String.

Es tut genau das, was angefordert wird, nur ohne die CaptureActivity...

Daher kann man die überspringen android-integration Bibliothek in der 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')
}

Die Methode wie folgt (die tatsächlich erzeugte Barcodes innerhalb eines Junit-Tests erzeugt):

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

Ich habe kürzlich Google Mobile Vision sowohl in iOS als auch in Android verwendet. Ich empfehle dringend, Google Barcode Scan zu verwenden. Es ist ziemlich reaktionsschnell für jede Orientierung und die Verarbeitungszeit ist ziemlich schnell. Es heißt Google Mobile Vision.

Die Barcode -Scanner -API erkennt Barcodes in Echtzeit in jeder Orientierung. Sie können auch mehrere Barcodes gleichzeitig in verschiedenen Formaten erkennen und analysieren.

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

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

Viel einfacher Ansatz.

Geben Sie einfach die Abhängigkeit in Ihre Gradle -Datei auf App Level ein

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

Definieren Sie eine Schaltfläche in Ihrer XML

new IntentIntegrator(this).initiateScan();

Und schreiben Sie unter dem Code nach OnCreate () der Java -Datei

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

        }
    }

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top