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:
- nie zostawiaj znaku wodnego (jak
onbarcode
biblioteka) - nie używaj interfejsu API usługi internetowej do tworzenia qrcode (jak biblioteka zxing Google)
- 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.
Odpowiedzi:
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 }
źródło
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(); }
źródło
Bitmap.createBitmap
.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);
źródło
implementation 'com.github.kenglxn.QRGen:android:[version]'
i zaimportować klasęimport net.glxn.qrgen.android.QRCode
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);
źródło
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.
źródło
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()
.źródło
java.awt
ani 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.