Làm cách nào để tạo mã QR cho ứng dụng Android? [đóng cửa]


92

Tôi cần tạo qrcode trong ứng dụng Android của mình và tôi cần thư viện hoặc mã nguồn cho phép tôi tạo mã QR trong ứng dụng Android.

Thư viện tôi cần phải:

  1. không để lại hình mờ (như onbarcodethư viện)
  2. không sử dụng API dịch vụ web để tạo qrcode (như thư viện zxing của Google)
  3. không cần trình cài đặt của bên thứ 3 (như QR Droid)

Tôi đã tạo mã như vậy cho iPhone (Objective-C) nhưng tôi cần một bản sửa lỗi nhanh cho Android cho đến khi tôi có thời gian để tạo trình tạo mã QR của riêng mình. Đây là dự án Android đầu tiên của tôi nên mọi sự trợ giúp sẽ được đánh giá cao.


bạn có thể sử dụng ZXing mã nguồn mở của nó
nandeesh

2
ZXing không phải là một API web, trên thực tế, xem dưới đây
Sean Owen

1
Hãy thử ứng dụng thử nghiệm đơn giản của tôi để tạo bitmap QR tại đây: stackoverflow.com/a/30529519/165071
Alexander Farber

Câu trả lời:


68

Bạn đã xem xét ZXING chưa? Tôi đã sử dụng thành công nó để tạo mã vạch. Bạn có thể xem một ví dụ hoạt động đầy đủ trong ứng dụng bitcoin src

// this is a small sample use of the QRCodeEncoder class from zxing
try {
    // generate a 150x150 QR code
    Bitmap bm = encodeAsBitmap(barcode_content, BarcodeFormat.QR_CODE, 150, 150);

    if(bm != null) {
        image_view.setImageBitmap(bm);
    }
} catch (WriterException e) { //eek }

Tôi đã tách nguồn mở bitcoin từ github và dùng thử trên thiết bị Android 2.2 của mình, ứng dụng bị đóng, có gì sai không?
Roy Lee

Xin lỗi, tôi đã không xem ứng dụng đó trong hơn một năm. Như đã đề cập bên dưới bởi Sean, hãy kiểm tra nguồn cho bộ mã hóa zxing tại đây: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Rob

@Rob nó sẽ tạo mã QR của số do người dùng xác định? chỉ số hoặc số với laphabets
Erum

@Erum nó sẽ tạo mã vạch cho bất kỳ chuỗi chữ số nào mà bạn cung cấp
Rob

Sử dụng cái này: implement 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan

97

với zxing đây là mã của tôi để tạo QR

 QRCodeWriter writer = new QRCodeWriter();
    try {
        BitMatrix bitMatrix = writer.encode(content, BarcodeFormat.QR_CODE, 512, 512);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                bmp.setPixel(x, y, bitMatrix.get(x, y) ? Color.BLACK : Color.WHITE);
            }
        }
        ((ImageView) findViewById(R.id.img_result_qr)).setImageBitmap(bmp);

    } catch (WriterException e) {
        e.printStackTrace();
    }

Đã làm cho tôi. Thêm vào dễ dàng.
Roon13

Cảm ơn bạn. Làm việc cho tôi.
RoShan Shan

@Stefano Nó có thể tạo ra n không. mã QR duy nhất?
Ashish Tiwari

Làm việc như một g88 quyến rũ !! +1 Có tùy chọn nào mà tôi có thể thêm một số biểu trưng vào điều này không?
Amit

1
để tránh rò rỉ bộ nhớ, đừng quên quản lý bộ nhớ bitmap đang được tạo bởi Bitmap.createBitmap.
gMale

43

Có thể chủ đề này cũ nhưng tôi thấy thư viện này rất hữu ích và dễ sử dụng

QRGen

ví dụ cho việc sử dụng nó trong android

 Bitmap myBitmap = QRCode.from("www.example.org").bitmap();
ImageView myImage = (ImageView) findViewById(R.id.imageView);
myImage.setImageBitmap(myBitmap);

2
Đây là giải pháp dễ dàng và hiệu quả!
Zohab Ali,

5
.bitmap () không được tìm thấy
Marcel Adel

Bạn nên sử dụng phụ thuộc android: implementation 'com.github.kenglxn.QRGen:android:[version]' và nhập lớp QRCode như thế này:import net.glxn.qrgen.android.QRCode
anro

2
Không giải quyết được: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan

2
Trong dự án build.gradle của bạn, hãy thêm maven {url " jitpack.io "} vào allprojects.repositiories
tagy22 Ngày

18

Đây là chức năng đơn giản và hoạt động của tôi để tạo Bitmap! Tôi chỉ sử dụng ZXing1.3.jar! Tôi cũng đã đặt Mức sửa thành Cao!

PS: x và y được đảo ngược, đó là điều bình thường, vì bitMatrix đảo ngược x và y. Mã này hoạt động hoàn hảo với một hình ảnh vuông.

public static Bitmap generateQrCode(String myCodeText) throws WriterException {
    Hashtable<EncodeHintType, ErrorCorrectionLevel> hintMap = new Hashtable<EncodeHintType, ErrorCorrectionLevel>();
    hintMap.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H); // H = 30% damage

    QRCodeWriter qrCodeWriter = new QRCodeWriter();

    int size = 256;

    ByteMatrix bitMatrix = qrCodeWriter.encode(myCodeText,BarcodeFormat.QR_CODE, size, size, hintMap);
    int width = bitMatrix.width();
    Bitmap bmp = Bitmap.createBitmap(width, width, Bitmap.Config.RGB_565);
    for (int x = 0; x < width; x++) {
        for (int y = 0; y < width; y++) {
            bmp.setPixel(y, x, bitMatrix.get(x, y)==0 ? Color.BLACK : Color.WHITE);
        }
    }
    return bmp;
}

BIÊN TẬP

Sẽ nhanh hơn khi sử dụng bitmap.setPixels (...) với mảng int pixel thay vì bitmap.setPixel từng cái một:

        BitMatrix bitMatrix = writer.encode(inputValue, BarcodeFormat.QR_CODE, size, size);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        int[] pixels = new int[width * height];
        for (int y = 0; y < height; y++) {
            int offset = y * width;
            for (int x = 0; x < width; x++) {
                pixels[offset + x] = bitMatrix.get(x, y) ? BLACK : WHITE;
            }
        }

        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);

12

Tôi đã sử dụng zxing-1.3 jar và tôi phải thực hiện một số thay đổi khi triển khai mã từ các câu trả lời khác, vì vậy tôi sẽ để giải pháp của mình cho người khác. Tôi đã làm như sau:

1) tìm zxing-1.3.jar, tải xuống và thêm thuộc tính (thêm jar bên ngoài).

2) trong bố cục hoạt động của tôi, hãy thêm ImageView và đặt tên cho nó (trong ví dụ của tôi là tnsd_iv_qr).

3) bao gồm mã trong hoạt động của tôi để tạo hình ảnh qr (trong ví dụ này, tôi đang tạo QR cho thanh toán bitcoin):

    QRCodeWriter writer = new QRCodeWriter();
    ImageView tnsd_iv_qr = (ImageView)findViewById(R.id.tnsd_iv_qr);
    try {
        ByteMatrix bitMatrix = writer.encode("bitcoin:"+btc_acc_adress+"?amount="+amountBTC, BarcodeFormat.QR_CODE, 512, 512);
        int width = 512;
        int height = 512;
        Bitmap bmp = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                if (bitMatrix.get(x, y)==0)
                    bmp.setPixel(x, y, Color.BLACK);
                else
                    bmp.setPixel(x, y, Color.WHITE);
            }
        }
        tnsd_iv_qr.setImageBitmap(bmp);
    } catch (WriterException e) {
        //Log.e("QR ERROR", ""+e);

    }

Nếu ai đó đang thắc mắc, biến "btc_acc_adress" là một Chuỗi (với địa chỉ BTC), thì amountBTC là một nhân đôi, tất nhiên, với số tiền giao dịch.


Sử dụng cái này: implement 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan

5

zxing không (chỉ) cung cấp một API web; thực sự, đó là Google cung cấp API, từ mã nguồn sau này có nguồn mở trong dự án.

Như Rob nói ở đây, bạn có thể sử dụng mã nguồn Java cho bộ mã hóa mã QR để tạo mã vạch thô và sau đó hiển thị nó dưới dạng Bitmap.

Tôi vẫn có thể đưa ra một cách dễ dàng hơn. Bạn có thể gọi Máy quét mã vạch theo Ý định để mã hóa mã vạch. Bạn chỉ cần một vài dòng mã và hai lớp từ dự án android-integration. Cái chính là IntentIntegrator . Chỉ cần gọi shareText().


xe tăng này có vẻ hữu ích, duy nhất tôi muốn hy vọng sẽ bỏ qua bất kỳ web API, mà sức một chút unconfortable, trong chế độ offline cho ứng dụng của tôi, nhưng điều này là rất hứa hẹn, tôi sẽ nhìn vào nó
Radu

Không chắc tôi đã rõ ràng nhưng tôi nói rằng các tùy chọn ZXing làm không liên quan đến bất kỳ API web
Sean Owen

Không, nó sử dụng một số thư viện unavaile trên android, như java.awt
siemanko

Xin chào, xin lỗi vì đã hủy chủ đề này, tôi nghĩ sẽ tốt hơn nếu tôi đặt một câu hỏi ở đây. Tôi có Ứng dụng Máy quét Mã vạch của các bạn (Tôi đang sử dụng nó để quét Mã QR) và nếu tôi nhận được câu trả lời này, tôi chỉ có thể làm tương tự, mở Máy quét mã vạch theo ý định với các đối số khác nhau và nó sẽ trả về Mã QR Bitmap để hiển thị?
Razgriz

1
@nivwusquorum, không, bộ mã hóa không sử dụng java.awthoặc kết nối với web và bạn có thể thấy nó được sử dụng trong ứng dụng Máy quét mã vạch - trên Android mà không cần kết nối internet. @Razgriz không nó không trả lại hình ảnh, nhưng hiển thị hình ảnh trên màn hình cho bạn. Người dùng có thể lưu hình ảnh.
Sean Owen
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.