จะสร้าง QR Code สำหรับแอปพลิเคชัน Android ได้อย่างไร? [ปิด]


92

ฉันต้องการสร้าง qrcode ในแอปพลิเคชัน Android ของฉันและฉันต้องการไลบรารีหรือซอร์สโค้ดที่ให้ฉันสร้าง QR Code ในแอพ Android

ห้องสมุดที่ฉันต้องการต้อง:

  1. ไม่ทิ้งลายน้ำ (เช่นonbarcodeไลบรารี)
  2. ไม่ใช้บริการเว็บ API เพื่อสร้าง qrcode (เช่นไลบรารี zxing ของ Google)
  3. ไม่จำเป็นต้องติดตั้งบุคคลที่สาม (เช่น QR Droid)

ฉันสร้างรหัสดังกล่าวสำหรับ iPhone แล้ว (Objective-C) แต่ฉันต้องการการแก้ไขอย่างรวดเร็วสำหรับ Android จนกว่าฉันจะมีเวลาสร้างเครื่องกำเนิด QR Code ของฉันเอง เป็นโครงการ Android แรกของฉันดังนั้นความช่วยเหลือใด ๆ จะได้รับการชื่นชม


คุณสามารถใช้ zxing โอเพนซอร์สได้
nandeesh

2
zxing ไม่ใช่ Web API จริงๆแล้วดูด้านล่าง
Sean Owen

1
ลองใช้แอปทดสอบง่ายๆของฉันเพื่อสร้างบิตแมป QR ที่นี่: stackoverflow.com/a/30529519/165071
Alexander Farber

คำตอบ:


68

คุณเคยมองหาZXINGหรือไม่? ฉันใช้มันสำเร็จในการสร้างบาร์โค้ด คุณสามารถดูตัวอย่างการทำงานแบบเต็มได้ในsrc แอปพลิเคชัน bitcoin

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

ฉันได้แยกโอเพ่นซอร์ส bitcoin จาก github และทดลองใช้บนอุปกรณ์ Android 2.2 ของฉันแอปพลิเคชันบังคับปิดมีอะไรผิดปกติหรือไม่?
Roy Lee

ขออภัยฉันไม่ได้ดูแอปนั้นมานานกว่าหนึ่งปีแล้ว ดังที่ฌอนกล่าวไว้ด้านล่างตรวจสอบแหล่งที่มาของตัวเข้ารหัส zxing ที่นี่: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Rob

@Rob มันจะสร้างรหัส QR ของหมายเลขที่ผู้ใช้กำหนด? เฉพาะตัวเลขหรือจำนวนที่มี Laphabets เท่านั้น
Erum

@Erum จะสร้างบาร์โค้ดสำหรับสตริงตัวเลขตัวอักษรส่วนใหญ่ที่คุณระบุ
Rob

ใช้สิ่งนี้: การใช้งาน 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan

97

ด้วย zxing นี่คือรหัสของฉันสำหรับสร้าง 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();
    }

ทำงานให้ฉัน เพิ่มง่าย
รุ ณ 13

ขอบคุณ. ทำงานให้ฉัน
RoShan Shan

@Stefano สามารถสร้าง n ไม่ได้ รหัส QR ที่ไม่ซ้ำใคร?
Ashish Tiwari

ทำงานอย่างมีเสน่ห์ g88 !! +1 มีตัวเลือกใดบ้างที่ฉันสามารถเพิ่มโลโก้ลงในสิ่งนี้ได้หรือไม่?
Amit

1
เพื่อหลีกเลี่ยงการรั่วไหลของหน่วยความจำที่ไม่ลืมที่จะจัดการหน่วยความจำบิตแมปBitmap.createBitmapที่จะถูกสร้างขึ้นโดย
gMale

43

อาจจะเป็นหัวข้อเก่า แต่ฉันพบว่าห้องสมุดนี้มีประโยชน์และใช้งานง่ายมาก

QRGen

ตัวอย่างสำหรับการใช้งานใน Android

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

2
นี่เป็นวิธีแก้ปัญหาที่ง่ายและใช้ได้ผล!
Zohab Ali

5
ไม่พบ. bitmap ()
Marcel Adel

คุณควรใช้การพึ่งพา Android: implementation 'com.github.kenglxn.QRGen:android:[version]' และนำเข้าคลาส QRCode ดังนี้import net.glxn.qrgen.android.QRCode
anro

2
ไม่สามารถแก้ไขได้: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan

2
ในโปรเจ็กต์ build.gradle ของคุณให้เพิ่ม maven {url " jitpack.io "} ใน allprojects.repositiories
tagy22

18

นี่คือฟังก์ชันที่เรียบง่ายและใช้งานได้ของฉันในการสร้าง Bitmap! ฉันใช้ ZXing1.3.jar เท่านั้น! ฉันยังตั้งค่าระดับการแก้ไขเป็นสูง!

PS: x และ y กลับด้านเป็นเรื่องปกติเพราะ bitMatrix ย้อนกลับ x และ y รหัสนี้ใช้งานได้ดีกับภาพสี่เหลี่ยมจัตุรัส

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

แก้ไข

เร็วกว่าที่จะใช้ bitmap.setPixels (... ) กับอาร์เรย์ int พิกเซลแทน bitmap.setPixel ทีละรายการ:

        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

ฉันใช้ zxing-1.3 jar และฉันต้องทำการเปลี่ยนแปลงบางอย่างโดยใช้โค้ดจากคำตอบอื่น ๆ ดังนั้นฉันจะทิ้งวิธีแก้ปัญหาไว้ให้คนอื่น ฉันทำสิ่งต่อไปนี้:

1) ค้นหา zxing-1.3.jar ดาวน์โหลดและเพิ่มคุณสมบัติ (เพิ่ม jar ภายนอก)

2) ในรูปแบบกิจกรรมของฉันเพิ่ม ImageView และตั้งชื่อ (ในตัวอย่างของฉันคือ tnsd_iv_qr)

3) รวมโค้ดในกิจกรรมของฉันเพื่อสร้าง qr image (ในตัวอย่างนี้ฉันกำลังสร้าง QR สำหรับการชำระเงินด้วย 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);

    }

หากมีคนสงสัยตัวแปร "btc_acc_adress" คือสตริง (ที่มีที่อยู่ BTC) จำนวน BTC จะเป็นสองเท่าโดยมีจำนวนธุรกรรมแน่นอน


ใช้สิ่งนี้: การใช้งาน 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan

5

zxing ไม่ได้ให้บริการเว็บ API เท่านั้น นั่นคือ Google ให้บริการ API จากซอร์สโค้ดที่ต่อมาโอเพ่นซอร์สในโครงการ

ดังที่ Rob กล่าวไว้ที่นี่คุณสามารถใช้ซอร์สโค้ด Java สำหรับตัวเข้ารหัสโค้ด QRเพื่อสร้างบาร์โค้ดดิบจากนั้นแสดงเป็นบิตแมป

ฉันสามารถเสนอวิธีที่ง่ายกว่านี้ได้ คุณสามารถเรียก Barcode Scanner โดย Intent เพื่อเข้ารหัสบาร์โค้ด android-integrationคุณจำเป็นต้องมีเพียงไม่กี่บรรทัดของรหัสและสองชั้นจากการดำเนินโครงการภายใต้ หนึ่งหลักคือIntentIntegrator เพียงโทรshareText().


รถถังนี้ดูเหมือนมีประโยชน์ฉันหวังว่าจะข้ามเว็บ API ใด ๆ ซึ่งอาจจะไม่สะดวกในโหมดออฟไลน์สำหรับแอปของฉัน แต่นี่เป็นสิ่งที่มีแนวโน้มมากฉันจะตรวจสอบ
Radu

ไม่แน่ใจว่าฉันชัดเจน แต่ฉันกำลังบอกว่าตัวเลือก zxing ไม่เกี่ยวข้องกับเว็บ API ใด ๆ
Sean Owen

ไม่มันใช้ไลบรารีบางตัวที่ไม่สามารถใช้งานบน Android ได้เช่น java.awt
siemanko

สวัสดีขออภัยที่ไม่ได้ตั้งกระทู้นี้ฉันคิดว่าจะดีกว่าถ้าฉันเพิ่งถามคำถามที่นี่ ฉันมีแอปพลิเคชั่นเครื่องสแกนบาร์โค้ดโดยพวกคุณ (ฉันใช้มันเพื่อสแกนรหัส QR) และถ้าฉันได้รับคำตอบนี้ถูกต้องฉันก็ทำได้เช่นเดียวกันเปิดเครื่องสแกนบาร์โค้ดผ่านความตั้งใจที่มีข้อโต้แย้งที่แตกต่างกันและมันจะส่งคืน Bitmap QR Code สำหรับการแสดงผล?
Razgriz

1
@nivwusquorum ไม่ตัวเข้ารหัสไม่ได้ใช้java.awtหรือเชื่อมต่อกับเว็บและคุณจะเห็นมันใช้ในแอปพลิเคชันเครื่องสแกนบาร์โค้ดบน Android โดยไม่ต้องเชื่อมต่ออินเทอร์เน็ต @Razgriz ไม่ไม่คืนรูป แต่แสดงภาพบนหน้าจอให้คุณ ผู้ใช้สามารถบันทึกภาพ
Sean Owen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.