Tích hợp thư viện ZXing trực tiếp vào ứng dụng Android của tôi


140

Tôi đang viết điều này trong sự tuyệt vọng đơn thuần :) Tôi đã được chỉ định làm một máy quét mã vạch độc lập (như một bằng chứng về khái niệm) cho điện thoại Android 1.6.

Đối với điều này, tôi đã phát hiện ra thư viện ZXing.

Tôi đã googled, đọc các chủ đề liên quan ở đây trên StackOverflow đã sử dụng thông thường và vv. Dường như không có gì giúp được, và tôi chỉ không thể đục lỗ trên phong tỏa tinh thần này: /

Tôi biết điều đó là có thể, để sử dụng lib và tạo máy quét mã vạch độc lập của riêng bạn. Tôi đã đọc rằng sử dụng "Máy quét mã vạch" được cung cấp bởi những người Zxing, cho đến nay là giải pháp đơn giản nhất (thông qua Ý định). Thật không may, đây không phải là một tùy chọn và một ứng dụng độc lập là mong muốn.

Vì vậy, để tổng hợp vấn đề của tôi:

  1. Làm cách nào để tích hợp lib nguồn ZXing vào dự án Mã Android của tôi thông qua Eclipse?
  2. Khi được tích hợp ... làm thế nào để sử dụng lib, để "tải" chức năng quét?
  3. Hướng dẫn từng bước gần như được ưa thích vì tôi mới bắt đầu làm việc trong Eclipse.

Tôi đã cố gắng làm cho dự án mã của mình phụ thuộc vào thư mục Android từ thư mục nguồn ZXing. Khi tôi làm như vậy, một lỗi hoàn toàn xuất hiện, chủ yếu liên quan đến 'org.apache' (??)

Tôi chỉ không thể tìm ra nó ... vì vậy một vài gợi ý sẽ hữu ích nhất.

Trước, cảm ơn bạn :)


Tôi tin rằng những gì bạn muốn làm được tìm thấy ở đây: stackoverflow.com/questions/4854442/ Khăn
Danny Remington - OMS

ZXing không phải là cách duy nhất để đọc mã vạch. Kể từ năm 2016, việc sử dụng API mã vạch Android dễ dàng hơn nhiều .
Dan Dascalescu

Câu trả lời:


127

CẬP NHẬT! - HƯỚNG DẪN + HƯỚNG DẪN

Tôi đã quản lý để tìm ra nó :) Và xuống bên dưới, bạn có thể đọc hướng dẫn từng bước để hy vọng có thể giúp những người khác có cùng vấn đề như tôi đã có;)

  1. Cài đặt Apache Ant - ( Xem video YouTube này để được trợ giúp cấu hình )
  2. Tải xuống nguồn ZXing từ trang chủ ZXing và giải nén nó
  3. Với việc sử dụng Windows Commandline (Run-> CMD) điều hướng đến thư mục gốc của phần tải xuống zxing src.
  4. Trong cửa sổ dòng lệnh - Gõ ant -f core/build.xmlnhấn enter và để Apache hoạt động thật kỳ diệu [ có vấn đề? ]
  5. Nhập Eclipse -> Dự án Android mới, dựa trên thư mục Android trong thư mục bạn vừa giải nén
  6. Nhấp chuột phải vào thư mục dự án -> Thuộc tính -> Đường dẫn xây dựng Java -> Thư viện -> Thêm JAR bên ngoài ...
  7. Điều hướng đến thư mục mới giải nén và mở thư mục lõi và chọn core.jar... nhấn enter!

Bây giờ bạn chỉ cần sửa một vài lỗi trong bản dịch và tệp AndroidManifest.xml :) Bây giờ bạn có thể biên dịch một cách vui vẻ và bây giờ bạn sẽ có một ứng dụng quét mã vạch độc lập hoạt động, dựa trên nguồn ZXing;)

Những người viết mã vui vẻ - Tôi hy vọng nó có thể giúp đỡ người khác :)


Tuyệt vời viết! Bạn có thể thêm một số chi tiết về những gì bạn chỉnh sửa trong AndroidManifest.xmltập tin? Tôi không thấy bất kỳ lỗi nào trong tập tin đó khi kiểm tra. Cảm ơn!
Brian Armstrong

7
Không có lỗi trong tệp AndroidManifest.xml, cũng như các bản dịch. Tuy nhiên, có các vấn đề tương thích trong SDK Android mới nhất. Nếu bạn sử dụng nó, bạn phải sử dụng mã nguồn sau này từ SVN.
Sean Owen

Xin chào, tôi đã cố gắng phát triển một ứng dụng khác để quét QR dưới dạng một ứng dụng độc lập mà không sử dụng bất kỳ ứng dụng QR Droid hoặc Barcode Scanner nào. Là các bước bạn đã đề cập để làm điều đó hay bạn vẫn đang sử dụng một số ứng dụng khác thông qua ý định hoặc bất cứ điều gì?
kumar

1
Gói zip từ code.google.com/p/zxing/doads/list chứa thư mục "lõi" cũng như "android" và "tích hợp android". Lý do tại sao bạn sử dụng "cốt lõi" là gì?
Michał K

1
Được rồi, bây giờ tôi biết tại sao. Nếu ai cũng thắc mắc, vui lòng xem stackoverflow.com/questions/4854442/ từ
Michał K

83

Dưới đây là hướng dẫn từng bước về cách tạo và hiển thị mã QR bằng thư viện ZXing mà không phải cài đặt ứng dụng của bên thứ ba. Lưu ý: bạn không phải xây dựng ZXing bằng ANT hoặc bất kỳ công cụ xây dựng nào khác. Các tập tin core.jarcó sẵn trong kho lưu trữ zip phát hành (đọc bên dưới).

  1. Tải về bản phát hành mới nhất của ZXing . - ( ZXing-*.zip)
  2. Giải nén kho lưu trữ zip này và tìm core.jartrong core/thư mục.
  3. Nếu bạn đang sử dụng IDE Eclipse, hãy kéo và thả core.jarvào libsthư mục của dự án Android của bạn. Khi được hỏi, chọn Sao chép .
  4. Sao chép hai lớp được cung cấp bên dưới ( Contents.java& QRCodeEncoder.java) vào gói chính của dự án Android của bạn.
  5. Tạo một ImageViewmục trong Hoạt động của bạn để hiển thị mã QR được tạo nếu bạn chưa có. Một ví dụ được đưa ra dưới đây:
  6. Sử dụng đoạn mã dưới đây để tạo mã QR ở định dạng Bitmap và hiển thị nó trong một ImageView.

Đây là một ImageViewyếu tố để thêm vào tệp XML bố trí hoạt động của bạn:

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

Đoạn mã:

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

Đây là 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
    };
}

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 mới nhất không có core.jar vì một số lý do. Tôi đã phải tải xuống 2.1 cho nó.
capcom

12
core.jar có sẵn riêng trong kho phát hành Maven, đối với phiên bản 2.2, liên kết là repo1.maven.org/maven2/com/google/zxing/core/2.2/core-2.2.jar
Nantoka

12

1
Phương thức encodeAsBitmap () của bạn trả về null nếu không được sửa đổi hoặc không thành công với NullPulumException nếu tôi nhận xét dòng trả về null. Tôi mới đến thư viện này. Tôi đang làm gì sai?
KG6ZVP

2
@Wesam, Nó thực sự hữu ích. Nhưng bạn cũng có thể cung cấp mã, nơi mà việc đảo ngược có thể được thực hiện. Ý tôi là, chuyển đổi mã QR trở lại Chuỗi?
Shaon Hasan

15

Các

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

tiếc là không làm việc cho tôi.

Đây là những gì làm việc cho tôi:

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

Vui lòng tìm liên kết tại đây: https://github.com/jTHERapps/zxing-android-embedded


1
Câu trả lời này bị lấn át bởi các câu trả lời khác ở đây. Hầu hết với ảnh chụp màn hình và như vậy. Đó là một sự xấu hổ vì đây là câu trả lời duy nhất thực sự hoạt động! Hãy chú ý đến cái này Điều ông không đề cập đến là dự án được liên kết là một chi nhánh nơi ai đó đã biến thư viện khó khăn này thành một thư viện dễ sử dụng (và thực sự dễ dàng). Chỉ cần tải về jar lõi từ dự án ZXING bình thường và bạn đã sẵn sàng. Thậm chí có ví dụ !!!!
StarWind0

1
Tôi ước tôi có thể cung cấp thêm upvote. Bạn không biết bao nhiêu lần khác nhau tôi đã cố gắng để tìm ra điều này trên các dự án khác nhau trong những năm qua.
StarWind0

1
Tôi rất vui được phục vụ mọi người :)
Karoly

11

Có vấn đề xây dựng với ANT? Hãy đọc tiếp

Nếu ant -f core/build.xml nói một cái gì đó như:

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

sau đó đặt JAVA_HOMEbiến môi trường của bạn vào thư mục java thích hợp. Tôi đã tìm thấy tools.jar trong (cho Windows):

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

vì vậy tôi đặt JAVA_HOME:

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

lý do cho cú pháp ngắn hơn tôi tìm thấy ở một số trang web có nội dung:

"Chúng tôi khuyên bạn nên chọn thư mục cài đặt không bao gồm khoảng trắng trong tên đường dẫn (ví dụ: KHÔNG cài đặt trong C: \ Program Files). Nếu Java được cài đặt trong một thư mục như vậy, điều quan trọng là phải đặt JAVA_HOME biến môi trường thành một đường dẫn không bao gồm khoảng trắng (ví dụ: C: \ Progra ~ 1); việc không thực hiện điều này sẽ dẫn đến ngoại lệ được ném bởi một số chương trình phụ thuộc vào giá trị của JAVA_HOME. "

Sau đó tôi đã khởi chạy lại cmd (quan trọng vì shell DOS chỉ đọc các env vars khi khởi chạy, vì vậy việc thay đổi var env sẽ yêu cầu bạn sử dụng shell mới để nhận giá trị cập nhật)

và cuối cùng là ant -f core/build.xmllàm việc


11

Vì một số câu trả lời đã lỗi thời, tôi muốn cung cấp cho riêng mình -

Để tích hợp thư viện ZXing vào ứng dụng Android của bạn theo gợi ý của Wiki của họ , bạn cần thêm 2 tệp Java vào dự án của mình:

Sau đó, trong Android Studio, thêm dòng sau vào tệp build.gradle :

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

Hoặc nếu vẫn sử dụng Eclipse với ADT-plugin, hãy thêm tệp core.jar vào thư mục con libs của dự án của bạn (ở đây toàn màn hình WindowsMac toàn màn hình ):

Ảnh chụp màn hình Windows

Cuối cùng, thêm mã này vào MainActivity.java của bạn :

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

Ứng dụng kết quả sẽ yêu cầu cài đặt và khởi động ứng dụng Quét mã vạch bằng ZXing (ứng dụng sẽ tự động quay lại ứng dụng của bạn sau khi quét):

Ứng dụng quét mã vạch

Ngoài ra, nếu bạn muốn xây dựng và chạy ứng dụng ZXing Test làm nguồn cảm hứng cho ứng dụng của riêng bạn:

Ứng dụng thử nghiệm ZXing

Sau đó, bạn cần 4 tệp Java từ GitHub :

  • Điểm chuẩnActivity.java
  • Điểm chuẩnAsyncTask.java
  • Điểm chuẩnItem.java
  • ZXingTestActivity.java

Và 3 tệp Jar từ kho lưu trữ Maven :

  • core.jar
  • android-core.jar
  • android-integration.jar

(Bạn có thể tự xây dựng các tệp Jar mvn package- nếu bạn kiểm tra ZXing từ GitHub và cài đặt các công cụ antmaven tại máy tính của bạn).

Lưu ý: nếu dự án của bạn không nhận ra các tệp Jar, bạn có thể cần phải nâng cấp phiên bản Java trong Thuộc tính dự án:

ảnh chụp màn hình thuộc tính


2
Đó là một câu trả lời tuyệt vời!
Paresh Mayani

3
Tôi e rằng điều này đã bỏ lỡ điểm của câu hỏi :-( Vấn đề là không dựa vào một ứng dụng bên ngoài. Điều này cho thấy cách .. sử dụng một ứng dụng bên ngoài? Xem trong tiêu đề câu hỏi "trực tiếp trong"
StarWind0

5

Đặt

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

vào phụ thuộc Gradle của bạn. Dễ như thế. Ưu tiên sử dụng hệ thống xây dựng Android Studio và Gradle.


Đúng! Đó là giải pháp thực sự trong năm 2015. Btw. phiên bản hiện tại là 3.2.0
funcoder 6/07/2015

điều này đã làm việc cho bất cứ ai? IntentIntegrator vẫn không thể được tìm thấy
Karoly 7/07/2015

Bạn nên sao chép các tệp IntentIntegrator.javaIntentResult.java theo cách thủ công vào dự án Android Studio của bạn.
Alexander Farber

4

Bạn đã thấy các trang wiki trên trang web zxing chưa? Có vẻ như bạn có thể thấy GetStarted , DeveloperNotesScanningViaIntent hữu ích.


Xin lỗi ... nó không hoàn toàn là sự giúp đỡ mà tôi đang tìm kiếm :) Nhưng hôm nay tôi đã có một bước đột phá: PI đã tự mình tìm ra nó;) Hướng dẫn cho những người xem khác, với cùng một vấn đề, sẽ được đăng tải một cách rõ ràng :)
AppDev


2

Từng bước để thiết lập zxing 3.2.1 trong nhật thực

  1. Tải xuống zxing-master.zip từ " https://github.com/zxing/zxing "
  2. Giải nén zxing-master.zip, Sử dụng nhật thực để nhập dự án "android" trong zxing-master
  3. Tải xuống core-3.2.1.jar từ " http://repo1.maven.org/maven2/com/google/zxing/core/3.2.1/ "
  4. Tạo thư mục "libs" trong dự án "android" và dán cor-3.2.1.jar vào thư mục libs
  5. Nhấp vào dự án: chọn "thuộc tính" -> "Trình biên dịch Java" để thay đổi cấp độ thành 1.7. Sau đó nhấp vào "Android" thay đổi "Mục tiêu xây dựng dự án" thành Android 4.4.2+, vì sử dụng 1.7 yêu cầu biên dịch với Android 4.4
  6. Nếu "CameraConfigurationUtils.java" không tồn tại trong "zxing-master / android / app / src / main / java / com / google / zxing / client / android / camera /". Bạn có thể sao chép nó từ "zxing-master / android-core / src / main / java / com / google / zxing / client / android / camera /" và dán vào dự án của bạn.
  7. Làm sạch và xây dựng dự án. Nếu dự án của bạn hiển thị lỗi về "switch - case", bạn nên thay đổi chúng thành "if - other".
  8. Đã hoàn thành. Làm sạch và xây dựng dự án.
  9. Liên kết tham khảo: Sử dụng ZXing để tạo ứng dụng quét mã vạch Android

2

Tôi đã thử tất cả các cách có thể để đạt được điều này và sau đó tôi phát hiện ra phiên bản rút gọn của xZing bởi JourneyApps. Tôi đã chuyển nó cho nhật thực và chia sẻ trên GitHub.

Nếu bạn đang sử dụng nhật thực, hãy sử dụng dự án này: -

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

Nếu bạn đang sử dụng Studio, hãy sử dụng dự án này: -

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

Ưu điểm

  1. Máy quét mã vạch sẵn có trong Ứng dụng của bạn không bắt buộc phải cài đặt ứng dụng của bên thứ ba bằng playstore.

  2. Bạn không cần phải nhầm lẫn giữa các ứng dụng khách Core, Android, v.v. chỉ cần bỏ các gói này và các bố cục có liên quan trong dự án của bạn và bạn đã sẵn sàng để đi. Chỉ yêu cầu Jar là com.google.zxing: core: 3.2.0 mà bạn có thể tải xuống từ

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

  3. Không cần thêm hàng tấn gói xem hình ảnh dưới đây để so sánh

Trước :-

nhập mô tả hình ảnh ở đây

Sau :-

nhập mô tả hình ảnh ở đây

  1. Phần quan trọng nhất là chúng có khả năng tùy biến cao . bạn có thể thêm đèn flash, sử dụng nó trong đoạn và hỗ trợ thay đổi hướng.

  2. Bạn có thể sử dụng hoạt động Chụp này trong Ứng dụng Cordova để quét mã vạch.

hoạt động chụp của bạn trong bảng kê khai ứng dụng sẽ như thế này

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

và plugin sẽ trông như thế này

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

Chúc mừng hội nhập !!


2

Các anh chàng zxing đã giúp việc tạo một dự án Android dễ dàng hơn với 1.7. Nó không đau đớn như trước đây. Đây là một blog nhanh chóng cho bất cứ ai muốn tạo một dự án zxing cho Android một cách nhanh chóng.

  • Kiểm tra các nguồn zxing từ zxing.org
  • Tạo một dự án Android trên nhật thực của bạn
  • Xóa tệp chính
  • Nhấp chuột phải vào thư mục của src Cảnh và nhấn nhập. Duyệt đến các thư mục sau theo thứ tự được đề cập. Khi bạn thêm chúng để nhập từng cái một, hãy đảm bảo rằng bạn có thư mục src trong trường chỉnh sửa của trình hướng dẫn nhập. Và bạn chỉ chọn thư mục com com trên cây thư mục bên trái. Không chọn src.
  • cốt lõi
  • tích hợp Android
  • Android
  • Đảm bảo rằng phiên bản sdk Android của bạn là 9, mọi thứ nhỏ hơn và androidmanifest.xml sẽ khóc.
  • String.xml trong một trong các ngôn ngữ sẽ cũi, chỉ cần đặt một / trước ký tự '

Một dự án android cho zxing 1.7 (thanh toán ngày 20 tháng 6).

http: //www.4 Shared.com/file/bFx8Y5Ys/zXingJune2010.html ( KHÔNG CÓ S ANN NÀO )


2

Tại sao nên sử dụng lib bên ngoài, khi các dịch vụ google play (kể từ phiên bản 7.8.0 ) bao gồm bộ giải mã mã vạch.


1
Bạn không thể cài đặt dịch vụ google play ở Trung Quốc, vì Google bị chặn.
Xiè Jìléi

Nếu bạn đã cài đặt các dịch vụ google play một cách may mắn, bạn vẫn không thể sử dụng nó ở Trung Quốc, vì Google đã bị chặn.
Xiè Jìléi

2

Tôi chỉ viết một phương pháp, trong đó giải mã được tạo ra mã vạch, Bitmapđể String.

Nó thực hiện chính xác những gì đang được yêu cầu, chỉ cần không có CaptureActivity...

Do đó, người ta có thể bỏ qua android-integrationthư viện trong 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')
}

Phương thức như sau (thực sự giải mã mã vạch được tạo, trong thử nghiệm 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

Gần đây tôi đã sử dụng tầm nhìn di động của google trong cả ios và Android. Tôi thực sự khuyên bạn nên sử dụng Google Barcode Scan. Nó là khá nhạy với bất kỳ định hướng và thời gian xử lý là khá nhanh. Nó được gọi là Tầm nhìn di động của Google.

API quét mã vạch phát hiện mã vạch theo thời gian thực theo bất kỳ hướng nào. Bạn cũng có thể phát hiện và phân tích một số mã vạch ở các định dạng khác nhau cùng một lúc.

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

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


0

Cách tiếp cận dễ dàng hơn nhiều.

Chỉ cần bao gồm sự phụ thuộc trong tệp cấp độ ứng dụng của bạn

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

Xác định một nút trong tệp xml của bạn và viết mã bên dưới vào tệp Java trong OnCreate () và bên trong nút nghe của OnClick

new IntentIntegrator(this).initiateScan();

Và viết mã dưới đây sau OnCreate () của tệp 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_resultkhông được định nghĩa ở đây
kelalaka

Đó là một biến toàn cục của kiểu String. Nếu bạn không sử dụng kết quả được quét bên ngoài onActivtyResult () thì bạn có thể định nghĩa nó cục bộ. Giống như Chuỗi st_scned_result = result.getContents (); Tôi đã cập nhật nó plz chk.
Tara

0

CẬP NHẬT 2020: Chỉ cần thêm nó vào tập tin Gradle của bạn. Nó hoạt động hoàn hảo!

repositories {
   jcenter()
}
implementation 'me.dm7.barcodescanner:zxing:1.9.13'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.