Mengintegrasikan perpustakaan ZXing langsung ke aplikasi Android saya


140

Saya menulis ini dengan putus asa :) Saya telah ditugaskan untuk membuat pemindai barcode mandiri (sebagai bukti konsep) ke ponsel Android 1.6.

Untuk ini saya telah menemukan perpustakaan ZXing.

Saya sudah googled, baca topik terkait di sini di StackOverflow menggunakan akal sehat dan sebagainya. Sepertinya tidak ada yang membantu, dan saya tidak bisa membuat lubang pada blokade mentale ini: /

Saya tahu itu mungkin, untuk menggunakan lib, dan membuat pemindai barcode mandiri Anda. Saya pernah membaca bahwa menggunakan "Pemindai Kode Batang" yang disediakan oleh orang-orang Zxing, sejauh ini merupakan solusi termudah (melalui Intent). Sayangnya ini bukan pilihan, dan aplikasi mandiri yang diinginkan.

Jadi, simpulkan masalah saya:

  1. Bagaimana cara mengintegrasikan sumber lib ZXing ke proyek Android Code saya melalui Eclipse?
  2. Ketika terintegrasi ... bagaimana memanfaatkan lib, untuk "memuat" fungsi pemindaian?
  3. Panduan langkah ke langkah hampir disukai karena saya baru saja mulai bekerja di Eclipse.

Saya sudah mencoba membuat proyek kode saya bergantung pada folder Android dari folder sumber ZXing. Ketika saya melakukannya, beberapa kesalahan muncul, sebagian besar mengenai 'org.apache' (??)

Aku hanya tidak bisa mengetahuinya ... jadi beberapa petunjuk akan sangat membantu.

Di muka, terima kasih :)


Saya percaya apa yang ingin Anda lakukan ada di sini: stackoverflow.com/questions/4854442/...
Danny Remington - OMS

ZXing bukan satu-satunya cara untuk membaca barcode. Pada 2016, jauh lebih mudah untuk menggunakan Android Barcode API .
Dan Dascalescu

Jawaban:


127

MEMPERBARUI! - ASK + PANDUAN

Saya sudah berhasil mengetahuinya :) Dan di bawah ini Anda dapat membaca panduan langkah demi langkah sehingga mudah-mudahan dapat membantu orang lain dengan masalah yang sama seperti saya;)

  1. Instal Apache Ant - ( Lihat video YouTube ini untuk bantuan konfigurasi )
  2. Unduh sumber ZXing dari beranda ZXing dan ekstrak
  3. Dengan menggunakan Windows Commandline (Run-> CMD) navigasikan ke direktori root yang diunduh zxing src.
  4. Di jendela commandline - Ketikkan ant -f core/build.xmltekan enter dan biarkan Apache bekerja itu ajaib [ mengalami masalah? ]
  5. Masukkan Eclipse -> Proyek Android baru, berdasarkan folder android di direktori yang baru saja Anda ekstrak
  6. Klik kanan folder proyek -> Properti -> Java Build Path -> Library -> Add External JARs ...
  7. Arahkan ke folder yang baru diekstrak dan buka direktori inti dan pilih core.jar... tekan enter!

Sekarang Anda hanya perlu memperbaiki beberapa kesalahan dalam terjemahan dan file AndroidManifest.xml :) Sekarang Anda dapat dengan senang hati mengkompilasi, dan sekarang Anda akan memiliki aplikasi pemindai barcode mandiri yang berfungsi, berdasarkan sumber ZXing;)

Selamat coding, saya harap ini bisa membantu orang lain :)


Langgan hebat! Bisakah Anda menambahkan detail tentang apa yang Anda edit dalam AndroidManifest.xmlfile? Saya tidak melihat ada kesalahan dalam file itu setelah diperiksa. Terima kasih!
Brian Armstrong

7
Tidak ada kesalahan dalam file AndroidManifest.xml, maupun terjemahannya. Namun, ada masalah kompatibilitas dalam SDK Android terbaru. Jika Anda menggunakannya, Anda harus menggunakan kode sumber nanti dari SVN.
Sean Owen

Hai, saya mencoba mengembangkan aplikasi lain untuk pemindaian QR sebagai aplikasi mandiri tanpa menggunakan aplikasi QR Droid atau Barcode Scanner. Apakah langkah-langkah yang Anda sebutkan untuk melakukan hal itu atau Anda masih menggunakan beberapa aplikasi lain melalui niat atau apa pun?
kumar

1
Paket zip dari code.google.com/p/zxing/downloads/list berisi direktori "inti" serta "android" dan "android-integrasi". Apa alasan mengapa Anda menggunakan "inti"?
Michał K

1
Baiklah, sekarang saya tahu kenapa. Jika ada yang bertanya-tanya juga, silakan lihat stackoverflow.com/questions/4854442/...
Michał K

83

Berikut ini adalah panduan langkah demi langkah tentang cara membuat dan menampilkan kode QR menggunakan perpustakaan ZXing tanpa harus menginstal aplikasi pihak ketiga. Catatan: Anda tidak harus membangun ZXing dengan ANT atau alat bangunan lainnya. File core.jarini tersedia di arsip zip yang dirilis (baca di bawah).

  1. Unduh rilis ZXing terbaru . - ( ZXing-*.zip)
  2. Ekstrak arsip zip ini dan temukan di core.jarbawah core/direktori.
  3. Jika Anda menggunakan Eclipse IDE, seret dan lepas core.jarke libsdirektori proyek Android Anda. Saat ditanya, pilih Salin .
  4. Salin dua kelas yang diberikan di bawah ini ( Contents.java& QRCodeEncoder.java) ke paket utama proyek Android Anda.
  5. Buat ImageViewitem di Aktivitas Anda untuk menampilkan kode QR yang dihasilkan jika Anda belum memilikinya. Contoh diberikan di bawah ini:
  6. Gunakan potongan kode di bawah ini untuk menghasilkan kode QR dalam format Bitmap dan menampilkannya dalam format ImageView .

Ini adalah ImageView elemen untuk ditambahkan ke file XML tata letak aktivitas Anda:

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

Cuplikan kode:

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

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

Dan 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
ZXing terbaru tidak memiliki core.jar di sana untuk beberapa alasan. Saya harus mengunduh 2.1 untuk itu.
capcom

12
core.jar tersedia secara terpisah di repositori rilis Maven, untuk versi 2.2 tautannya adalah repo1.maven.org/maven2/com/google/zxing/core/2.2/core-2.2.jar
Nantoka


1
Metode encodeAsBitmap () Anda mengembalikan null jika tidak dimodifikasi atau gagal dengan NullPointerException jika saya mengomentari baris yang mengembalikan nol. Saya baru di perpustakaan ini. Apa yang saya lakukan salah?
KG6ZVP

2
@ Wyam, Itu sangat membantu. Tapi bisakah kamu juga memberikan kode, di mana kebalikannya bisa dilakukan. Maksud saya, konversikan kode QR kembali ke String?
Shaon Hasan

15

Itu

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

sayangnya tidak berhasil untuk saya.

Inilah yang bekerja untuk saya:

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

Silakan temukan tautan di sini: https://github.com/journeyapps/zxing-android-embedded


1
Jawaban ini dikerdilkan oleh jawaban lain di sini. Sebagian besar dengan tangkapan layar dan semacamnya. Sayang sekali karena ini adalah satu-satunya jawaban yang benar-benar berfungsi! Perhatikan yang ini. Yang tidak ia sebutkan adalah proyek tertautnya adalah cabang di mana seseorang menjadikan perpustakaan yang sulit ini menjadi perpustakaan yang mudah (dan sebenarnya mudah) untuk digunakan. Unduh saja stoples inti dari proyek ZXING normal dan Anda siap melakukannya. Bahkan punya contoh !!!!
StarWind0

1
Saya berharap bisa memberi lebih banyak suara. Anda tidak tahu berapa kali saya mencoba mencari tahu ini pada proyek yang berbeda selama bertahun-tahun.
StarWind0

1
Saya senang melayani teman-teman :)
Karoly

11

Mengalami masalah dengan ANT? Teruslah membaca

Jika ant -f core/build.xml mengatakan sesuatu seperti:

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

kemudian atur JAVA_HOMEvariabel lingkungan Anda ke folder java yang tepat. Saya menemukan tools.jar di (untuk Windows) saya:

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

jadi saya atur JAVA_HOMEke:

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

alasan untuk sintaks yang lebih pendek saya temukan di beberapa situs yang mengatakan:

"Sangat disarankan bahwa Anda memilih direktori instalasi yang tidak menyertakan spasi dalam nama path (mis. JANGAN menginstal di C: \ Program Files). Jika Java diinstal pada direktori seperti itu, sangat penting untuk mengatur JAVA_HOME variabel lingkungan ke jalur yang tidak termasuk spasi (misalnya, C: \ Progra ~ 1); kegagalan untuk melakukan ini akan menghasilkan pengecualian yang dilemparkan oleh beberapa program yang bergantung pada nilai JAVA_HOME. "

Saya kemudian meluncurkan ulang cmd (penting karena shell DOS hanya membaca env vars setelah diluncurkan, jadi mengubah env var akan mengharuskan Anda menggunakan shell baru untuk mendapatkan nilai yang diperbarui)

dan akhirnya ant -f core/build.xmlberhasil.


11

Karena beberapa jawaban sudah ketinggalan zaman, saya ingin memberikan jawaban saya sendiri -

Untuk mengintegrasikan perpustakaan ZXing ke aplikasi Android Anda seperti yang disarankan oleh Wiki mereka , Anda perlu menambahkan 2 file Java ke proyek Anda:

Kemudian di Android Studio tambahkan baris berikut ke file build.gradle :

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

Atau jika masih menggunakan Eclipse dengan ADT-plugin, tambahkan file core.jar ke subdirektori libs proyek Anda (di sini Windows layar penuh dan Mac layar penuh ):

Tangkapan layar Windows

Akhirnya tambahkan kode ini ke MainActivity.java Anda :

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

Aplikasi yang dihasilkan akan meminta untuk menginstal dan memulai aplikasi Pemindai Kode Batang dengan ZXing (yang akan kembali ke aplikasi Anda secara otomatis setelah pemindaian):

Aplikasi Barcode Scanner

Selain itu, jika Anda ingin membangun dan menjalankan aplikasi Tes ZXing sebagai inspirasi untuk aplikasi Anda sendiri:

Aplikasi Uji ZXing

Maka Anda memerlukan 4 file Java dari GitHub :

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

Dan 3 file jar dari repositori Maven :

  • core.jar
  • android-core.jar
  • android-integrasi.jar

(Anda dapat membuat sendiri file Jar mvn package- jika Anda memeriksa ZXing dari GitHub dan menginstal alat semut dan pakar di komputer Anda).

Catatan: jika proyek Anda tidak mengenali file Jar, Anda mungkin perlu meningkatkan versi Java di Properti Proyek:

tangkapan layar properti


2
Itu jawaban yang fantastis!
Paresh Mayani

3
Saya khawatir pertanyaan ini tidak terjawab :-( Intinya adalah untuk tidak bergantung pada aplikasi eksternal. Ini menunjukkan bagaimana .. menggunakan aplikasi eksternal? Lihat di judul pertanyaan "langsung di"
StarWind0

5

Taruh

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

ke dalam dependensi Gradle Anda. Semudah itu. Sebelum menggunakan sistem pembangunan Android Studio dan Gradle.


Baik! Itu solusi nyata pada tahun 2015. Btw. versi saat ini adalah 3.2.0
funcoder

apakah ini berhasil untuk siapa saja? IntentIntegrator masih tidak dapat ditemukan
Karoly

Anda harus menyalin file IntentIntegrator.java dan IntentResult.java secara manual ke proyek Android Studio Anda.
Alexander Farber

4

Pernahkah Anda melihat halaman wiki di situs web zxing? Sepertinya Anda mungkin merasa GettingStarted , DeveloperNotes dan ScanningViaIntent bermanfaat.


Maaf ... itu tidak cukup bantuan yang saya cari :) Tapi hari ini saya punya terobosan: PI berhasil mengetahuinya sendiri;) Panduan untuk pemirsa lain, dengan masalah yang sama, akan diposting dengan sangat keras :)
AppDev


2

Langkah demi langkah untuk mengatur zxing 3.2.1 di gerhana

  1. Unduh zxing-master.zip dari " https://github.com/zxing/zxing "
  2. Unzip zxing-master.zip, Gunakan eclipse untuk mengimpor proyek "android" di zxing-master
  3. Unduh core-3.2.1.jar dari " http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ "
  4. Buat folder "libs" di proyek "android" dan rekatkan cor-3.2.1.jar ke folder libs
  5. Klik pada proyek: pilih "properties" -> "Java Compiler" untuk mengubah level menjadi 1.7. Kemudian klik "Android", ubah "Project build target" ke android 4.4.2+, karena menggunakan 1.7 memerlukan kompilasi dengan Android 4.4
  6. Jika "CameraConfigurationUtils.java" tidak ada di "zxing-master / android / app / src / main / java / com / google / zxing / client / android / camera /". Anda dapat menyalinnya dari "zxing-master / android-core / src / main / java / com / google / zxing / client / android / camera /" dan rekatkan ke proyek Anda.
  7. Bersihkan dan bangun proyek. Jika proyek Anda menampilkan kesalahan tentang "switch-case", Anda harus mengubahnya ke "if-else".
  8. Lengkap. Bersihkan dan bangun proyek.
  9. Tautan referensi: Menggunakan ZXing untuk membuat aplikasi pemindaian barcode android

2

Saya mencoba semua cara yang mungkin untuk mencapai ini dan kemudian saya menemukan versi Minified dari xing oleh JourneyApps. Saya telah porting untuk gerhana dan berbagi di GitHub.

Jika Anda menggunakan gerhana gunakan proyek ini: -

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

Jika Anda menggunakan Studio, gunakan proyek ini: -

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

Keuntungan

  1. Pemindai kode batang bawaan di aplikasi Anda tidak perlu menginstal aplikasi pihak ketiga menggunakan playstore.

  2. Anda tidak perlu bingung antara Core, Android client, dan lain-lain. Jatuhkan saja paket-paket ini dan luncurkan tata letak di proyek Anda dan Anda siap melakukannya. Hanya Jar yang diperlukan adalah com.google.zxing: core: 3.2.0 yang dapat Anda unduh

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

  3. Tidak perlu menambahkan banyak paket, lihat gambar di bawah ini untuk perbandingan

Sebelum :-

masukkan deskripsi gambar di sini

Setelah: -

masukkan deskripsi gambar di sini

  1. Bagian terpenting adalah mereka sangat dapat disesuaikan yaitu. Anda dapat menambahkan lampu flash, menggunakannya dalam fragmen dan mendukung perubahan orientasi.

  2. Anda dapat menggunakan aktivitas Capture ini di Cordova App untuk memindai barcode.

aktivitas penangkapan Anda dalam manifes aplikasi akan terlihat seperti ini

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

dan plugin akan terlihat seperti ini

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

Selamat Integrasi !!


2

Orang-orang Zxing telah membuatnya lebih mudah untuk membuat proyek android dengan 1.7. Ini tidak menyakitkan seperti dulu. Ini adalah blog cepat untuk siapa saja yang ingin membuat proyek zxing untuk android dengan cepat.

  • Lihat sumber-sumber zxing dari zxing.org
  • Buat proyek Android di gerhana Anda
  • Hapus main.xml
  • Klik kanan pada direktori "src" dan tekan import. Jelajahi direktori berikut dalam urutan yang disebutkan. Saat Anda menambahkannya untuk impor satu per satu, pastikan Anda memiliki direktori src di bidang edit pada panduan impor. Dan Anda hanya memilih direktori "com" di pohon direktori kiri. Jangan pilih src.
  • inti
  • integrasi android
  • android
  • Pastikan versi android SDK Anda adalah 9, apa pun yang lebih rendah dan androidmanifest.xml akan menangis.
  • Strings.xml di salah satu bahasa akan boks, cukup beri a / sebelum karakter '

Sebuah proyek android untuk zxing 1.7 (checkout 20 Juni).

http://www.4shared.com/file/bFx8Y5Ys/zXingJune2010.html ( TIDAK TERSEDIA APA PUN )


2

Mengapa menggunakan lib eksternal, ketika layanan google play (sejak versi 7.8.0 ) menyertakan decoder barcode.


1
Anda tidak dapat menginstal layanan google play di Cina, karena Google diblokir.
Xiè Jìléi

Jika Anda memiliki layanan google play yang untungnya diinstal, Anda masih tidak dapat menggunakannya di Cina, karena Google diblokir.
Xiè Jìléi

2

Saya baru saja menulis sebuah metode, yang menerjemahkan kode bar yang dihasilkan, Bitmapuntuk String.

Itu tidak persis apa yang diminta, hanya tanpa CaptureActivity...

Oleh karena itu, seseorang dapat melewati android-integrationperpustakaan di 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')
}

Metode sebagai berikut (yang benar-benar menerjemahkan kode batang yang dihasilkan, dalam uji 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

Baru-baru ini saya menggunakan visi seluler Google di ios dan android. Saya sangat merekomendasikan untuk menggunakan Google Barcode Scan. Ini cukup responsif dengan orientasi apa pun dan waktu pemrosesan cukup cepat. Ini disebut Google Mobile Vision.

Barcode Scanner API mendeteksi barcode secara real time dalam orientasi apa pun. Anda juga dapat mendeteksi dan mem-parsing beberapa barcode dalam format berbeda secara bersamaan.

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

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


0

Pendekatan yang jauh lebih mudah.

Cukup sertakan ketergantungan dalam file tingkat tingkat aplikasi Anda

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

Tentukan satu tombol di file xml Anda dan dan tulis kode di bawah ini dalam file Java di OnCreate () dan di dalam pendengar tombol OnClick

new IntentIntegrator(this).initiateScan();

Dan tulis kode di bawah ini setelah OnCreate () dari 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_resulttidak didefinisikan di sini
kelalaka

Itu adalah variabel global tipe String. Jika Anda tidak menggunakan hasil pindaian dari sisi onActivtyResult () ini, maka Anda dapat mendefinisikannya secara lokal. Seperti String st_scanned_result = result.getContents (); Saya sudah perbarui itu plz chk.
Tara

0

UPDATE 2020: Cukup tambahkan ini ke file Gradle Anda. Itu bekerja dengan sempurna!

repositories {
   jcenter()
}
implementation 'me.dm7.barcodescanner:zxing:1.9.13'
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.