Jak wygenerować kod QR dla aplikacji na Androida? [Zamknięte]


92

Muszę utworzyć kod QR w mojej aplikacji na Androida i potrzebuję biblioteki lub kodu źródłowego, który pozwoli mi utworzyć kod QR w aplikacji na Androida.

Biblioteka, której potrzebuję, musi:

  1. nie zostawiaj znaku wodnego (jak onbarcodebiblioteka)
  2. nie używaj interfejsu API usługi internetowej do tworzenia qrcode (jak biblioteka zxing Google)
  3. nie potrzebuje instalatorów innych firm (takich jak QR Droid)

Stworzyłem już taki kod dla iPhone'a (Objective-C), ale potrzebuję szybkiej poprawki dla Androida, dopóki nie będę miał czasu na stworzenie własnego generatora QR Code. To mój pierwszy projekt na Androida, więc każda pomoc będzie mile widziana.


możesz użyć zxing, jego open source
nandeesh

2
zxing nie jest internetowym interfejsem API, w rzeczywistości, patrz poniżej
Sean Owen

1
Wypróbuj moją prostą aplikację testową do generowania bitmapy QR tutaj: stackoverflow.com/a/30529519/165071
Alexander Farber

Odpowiedzi:


68

Czy spojrzałeś na ZXING ? Z powodzeniem używam go do tworzenia kodów kreskowych. Możesz zobaczyć pełny działający przykład w src aplikacji 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 }

Rozwidliłem otwarte oprogramowanie Bitcoin z Github i wypróbowałem na moich urządzeniach z Androidem 2.2, aplikacja została zamknięta, coś nie tak?
Roy Lee

Przepraszam, że nie oglądałem tej aplikacji od ponad roku. Jak wspomniał poniżej Sean, sprawdź źródło kodera zxing tutaj: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/ ...
Rob

@Rob wygeneruje kod QR o numerze zdefiniowanym przez użytkownika? tylko numer lub numer z lafabetami
Erum

@Erum utworzy kod kreskowy dla większości podanych ciągów alfanumerycznych
Rob

Użyj tego: implementacja „me.dm7.barcodescanner: zxing: 1.9.13”
M. Usman Khan

97

z zxing to mój kod do tworzenia 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();
    }

Pracował dla mnie. Łatwy dodatek.
Roon13

Dzięki Ci. Pracuj dla mnie.
RoShan Shan

@Stefano Czy może wygenerować n nie. unikalnego kodu QR?
Ashish Tiwari

Działał jak urok g88 !! +1 Czy jest jakaś opcja, w której mogę dodać do tego logo?
Amit

1
aby uniknąć wycieków pamięci, nie zapomnij zarządzać pamięcią bitmap, która jest tworzona przez Bitmap.createBitmap.
gMale,

43

Może to stary temat, ale uważam, że ta biblioteka jest bardzo pomocna i łatwa w użyciu

QRGen

przykład użycia go w systemie Android

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

2
To proste i działające rozwiązanie!
Zohab Ali

5
.bitmap () nie został znaleziony
Marcel Adel

Powinieneś użyć zależności Androida: implementation 'com.github.kenglxn.QRGen:android:[version]' i zaimportować klasę import net.glxn.qrgen.android.QRCode
QRCode w

2
Nie udało się rozwiązać: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan

2
W swoim projekcie build.gradle dodaj maven {url " jitpack.io "} do allprojects.repositiories
tagy 22

18

Oto moja prosta i działająca funkcja do generowania mapy bitowej! Używam tylko ZXing1.3.jar! Ustawiłem również poziom korekcji na wysoki!

PS: x i y są odwrócone, to normalne, ponieważ bitMatrix odwraca xiy. Ten kod działa doskonale z kwadratowym obrazem.

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

EDYTOWAĆ

Szybciej jest używać bitmap.setPixels (...) z tablicą int pixel zamiast bitmap.setPixel jeden po drugim:

        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

Użyłem jar zxing-1.3 i musiałem wprowadzić kilka zmian implementując kod z innych odpowiedzi, więc swoje rozwiązanie zostawię innym. Zrobiłem co następuje:

1) znajdź zxing-1.3.jar, pobierz go i dodaj właściwości (dodaj zewnętrzny jar).

2) w moim układzie aktywności dodaj ImageView i nazwij go (w moim przykładzie był to tnsd_iv_qr).

3) dołącz kod do mojej aktywności, aby utworzyć obraz qr (w tym przykładzie tworzyłem QR dla płatności 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);

    }

Jeśli ktoś się zastanawia, zmienna "btc_acc_adress" to String (z adresem BTC), kwotaBTC to podwójna, oczywiście kwota transakcji.


Użyj tego: implementacja „me.dm7.barcodescanner: zxing: 1.9.13”
M. Usman Khan

5

zxing nie zapewnia (tylko) internetowego interfejsu API; tak naprawdę to Google dostarcza API z kodu źródłowego, który został później otwarty w projekcie.

Jak mówi Rob, możesz użyć kodu źródłowego Java do kodera kodu QR, aby utworzyć surowy kod kreskowy, a następnie renderować go jako mapę bitową.

Wciąż mogę zaoferować łatwiejszy sposób. Możesz zadzwonić do Barcode Scanner przez Intent, aby zakodować kod kreskowy. Potrzebujesz tylko kilku wierszy kodu i dwóch klas z projektu pod android-integration. Głównym z nich jest IntentIntegrator . Po prostu zadzwoń shareText().


czołgi wydaje się przydatne, tylko mam nadzieję ominąć jakiekolwiek internetowe API, które mogą być nieco niewygodne, w trybie offline dla mojej aplikacji, ale jest to bardzo obiecujące, przyjrzę się temu
Radu

Nie jestem pewien, czy było jasne, ale mówię, że opcje zxing nie obejmują żadnych interfejsów API sieci Web
Sean Owen

Nie, używa niektórych bibliotek niedostępnych na Androidzie, takich jak java.awt
siemanko

Witam, przepraszam za necro ten wątek, myślę, że lepiej gdybym tu zadał pytanie. Mam aplikację skanera kodów kreskowych od was (używam jej do skanowania kodu QR) i jeśli dobrze odpowiem, mógłbym zrobić to samo, otworzyć skaner kodów kreskowych za pomocą intencji z różnymi argumentami i zwróci Bitmapowy kod QR do wyświetlenia?
Razgriz

1
@nivwusquorum, nie, koder nie używa java.awtani nie łączy się z siecią, a widać, że jest używany w aplikacji Barcode Scanner - na Androidzie, bez połączenia z Internetem. @Razgriz no, nie zwraca obrazu, ale pokazuje obraz na ekranie. Użytkownik może zapisać obraz.
Sean Owen,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.