Bagaimana cara menghasilkan Kode QR untuk aplikasi Android? [Tutup]

92

Saya perlu membuat kode QR di aplikasi Android saya, dan saya memerlukan perpustakaan atau kode sumber yang memungkinkan saya membuat Kode QR di aplikasi Android.

Perpustakaan yang saya butuhkan harus:

  1. tidak meninggalkan tanda air (seperti onbarcodeperpustakaan)
  2. tidak menggunakan API layanan web untuk membuat kode QR (seperti perpustakaan Google zxing)
  3. tidak perlu pemasang pihak ketiga (seperti QR Droid)

Saya sudah membuat kode seperti itu untuk iPhone (Objective-C) tetapi saya perlu perbaikan cepat untuk Android sampai saya punya waktu untuk membuat generator QR Code sendiri. Ini adalah proyek android pertama saya sehingga bantuan apa pun akan dihargai.

Radu
sumber
Anda dapat menggunakan zxing open source
nandeesh
2
zxing bukanlah API web, sebenarnya, lihat di bawah
Sean Owen
1
Coba aplikasi pengujian sederhana saya untuk menghasilkan bitmap QR di sini: stackoverflow.com/a/30529519/165071
Alexander Farber

Jawaban:

68

Sudahkah Anda melihat ke ZXING ? Saya telah berhasil menggunakannya untuk membuat kode batang. Anda dapat melihat contoh kerja lengkap di src aplikasi 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 }
rampok
sumber
Saya telah bercabang bitcoin open source dari github dan mencoba pada perangkat Android 2.2 saya, aplikasi ditutup paksa, ada yang salah?
Roy Lee
Maaf saya belum melihat aplikasi itu selama lebih dari setahun. Seperti disebutkan di bawah oleh Sean, periksa sumber untuk pembuat enkode zxing di sini: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Rob
@Rob itu akan menghasilkan kode QR dari nomor yang ditentukan pengguna? hanya nomor atau angka dengan laphabets
Erum
@Erum itu akan membuat kode batang untuk sebagian besar string alfa numerik yang Anda berikan
Rob
Gunakan ini: implementasi 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
97

dengan zxing ini adalah kode saya untuk membuat 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();
    }
Stefano
sumber
Bekerja untuk saya. Add on yang mudah.
Roon13
Terimakasih. Bekerja untuk saya.
RoShan Shan
@ Stefano Bisakah itu menghasilkan n no. kode QR unik?
Ashish Tiwari
Bekerja seperti pesona g88 !! +1 Apakah ada opsi di mana saya dapat menambahkan beberapa logo ke sini?
Amit
1
untuk menghindari kebocoran memori, jangan lupa untuk mengelola memori bitmap yang sedang dibuat Bitmap.createBitmap.
gMale
43

Mungkin topik lama ini tetapi menurut saya perpustakaan ini sangat membantu dan mudah digunakan

QRGen

contoh untuk menggunakannya di android

 Bitmap myBitmap = QRCode.from("www.example.org").bitmap();
ImageView myImage = (ImageView) findViewById(R.id.imageView);
myImage.setImageBitmap(myBitmap);
Antwan
sumber
2
Ini adalah solusi yang mudah dan berhasil!
Zohab Ali
5
.bitmap () tidak ditemukan
Marcel Adel
Anda harus menggunakan ketergantungan android: implementation 'com.github.kenglxn.QRGen:android:[version]' dan mengimpor kelas QRCode seperti ini:import net.glxn.qrgen.android.QRCode
anro
2
Gagal menyelesaikan: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan
2
Dalam proyek Anda build.gradle tambahkan maven {url " jitpack.io "} ke allprojects.repositiories
tagy22
18

Ini adalah fungsi sederhana dan berfungsi saya untuk menghasilkan Bitmap! Saya Menggunakan ZXing1.3.jar saja! Saya juga menyetel Tingkat Koreksi ke Tinggi!

PS: x dan y terbalik, itu normal, karena bitMatrix membalikkan x dan y. Kode ini berfungsi sempurna dengan gambar persegi.

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

EDIT

Lebih cepat menggunakan bitmap.setPixels (...) dengan larik int piksel daripada bitmap.setPixel satu per satu:

        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);
bluestart83
sumber
12

Saya menggunakan jar zxing-1.3 dan saya harus membuat beberapa perubahan menerapkan kode dari jawaban lain, jadi saya akan meninggalkan solusi saya untuk orang lain. Saya melakukan hal berikut:

1) temukan zxing-1.3.jar, unduh dan tambahkan properti (tambahkan jar eksternal).

2) dalam layout aktivitas saya tambahkan ImageView dan beri nama (dalam contoh saya itu tnsd_iv_qr).

3) sertakan kode dalam aktivitas saya untuk membuat gambar qr (dalam contoh ini saya membuat QR untuk pembayaran 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);

    }

Jika seseorang bertanya-tanya, variabel "btc_acc_adress" adalah String (dengan alamat BTC), jumlahBTC adalah ganda, dengan, tentu saja, jumlah transaksi.

Adam Staszak
sumber
Gunakan ini: implementasi 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
5

zxing tidak (hanya) menyediakan API web; sungguh, Google menyediakan API, dari kode sumber yang kemudian menjadi sumber terbuka dalam proyek tersebut.

Seperti yang dikatakan Rob di sini Anda dapat menggunakan kode sumber Java untuk pembuat kode QR untuk membuat kode batang mentah dan kemudian merendernya sebagai Bitmap.

Saya masih bisa menawarkan cara yang lebih mudah. Anda dapat memanggil Pemindai Kode Batang dengan Maksud untuk menyandikan kode batang. Anda hanya perlu beberapa baris kode, dan dua kelas dari proyek, di bawah android-integration. Yang utama adalah IntentIntegrator . Telepon saja shareText().

Sean Owen
sumber
tank ini tampaknya berguna, hanya saja saya berharap untuk melewati API web apa pun, yang mungkin agak tidak nyaman, dalam mode offline untuk aplikasi saya, tetapi ini sangat menjanjikan, saya akan memeriksanya
Radu
Tidak yakin saya sudah jelas tetapi saya mengatakan bahwa opsi zxing tidak melibatkan API web apa pun
Sean Owen
Tidak, ini menggunakan beberapa pustaka yang tidak tersedia di android, seperti java.awt
siemanko
Halo, maaf untuk membatalkan utas ini, saya pikir lebih baik jika saya hanya mengajukan pertanyaan di sini. Saya memiliki Aplikasi Pemindai Kode Batang oleh kalian (saya menggunakannya untuk memindai Kode QR) dan jika saya menjawabnya dengan benar, saya dapat melakukan hal yang sama, buka Pemindai Kode Batang melalui maksud dengan argumen yang berbeda dan itu akan mengembalikan Bitmap QR Code untuk tampilan?
Razgriz
1
@nivwusquorum, tidak, pembuat enkode tidak menggunakan java.awt, atau terhubung ke web, dan Anda dapat melihatnya digunakan di aplikasi Pemindai Kode Batang - di Android, tanpa koneksi internet. @Razgriz no itu tidak mengembalikan gambar, tetapi menunjukkan gambar di layar untuk Anda. Pengguna dapat menyimpan gambar tersebut.
Sean Owen