Preciso criar um qrcode em meu aplicativo Android e preciso de uma biblioteca ou código-fonte que me permita criar um código QR em um aplicativo Android.
A biblioteca de que preciso deve:
- não deixar marca d'água (como
onbarcode
biblioteca) - não use a API de serviço da web para criar o qrcode (como a biblioteca zxing do Google)
- não precisa de instaladores de terceiros (como QR Droid)
Já criei esse código para iPhone (Objective-C), mas preciso de uma solução rápida para Android até ter tempo de fazer meu próprio gerador de QR Code. É meu primeiro projeto android, então qualquer ajuda será apreciada.
Respostas:
Você já pesquisou o ZXING ? Tenho usado com sucesso para criar códigos de barras. Você pode ver um exemplo completo de trabalho no aplicativo 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 }
fonte
com zxing este é o meu código para criar 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(); }
fonte
Bitmap.createBitmap
.Talvez este tópico antigo, mas achei que esta biblioteca é muito útil e fácil de usar
QRGen
exemplo para usá-lo no Android
Bitmap myBitmap = QRCode.from("www.example.org").bitmap(); ImageView myImage = (ImageView) findViewById(R.id.imageView); myImage.setImageBitmap(myBitmap);
fonte
implementation 'com.github.kenglxn.QRGen:android:[version]'
e importar a classe QRCode assim:import net.glxn.qrgen.android.QRCode
Aqui está minha função simples e funcional para gerar um bitmap! Eu uso apenas ZXing1.3.jar! Eu também configurei o Nível de Correção para Alto!
PS: x e y estão invertidos, é normal, porque bitMatrix inverte x e y. Este código funciona perfeitamente com uma imagem quadrada.
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; }
EDITAR
É mais rápido usar bitmap.setPixels (...) com uma matriz de pixel int em vez de bitmap.setPixel um por um:
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);
fonte
Usei o jar zxing-1.3 e tive que fazer algumas mudanças implementando o código de outras respostas, então deixarei minha solução para outras. Eu fiz o seguinte:
1) encontre zxing-1.3.jar, baixe-o e adicione propriedades (adicione jar externo).
2) em meu layout de atividade, adicione ImageView e nomeie-o (no meu exemplo foi tnsd_iv_qr).
3) incluir código em minha atividade para criar imagem qr (neste exemplo, eu estava criando QR para pagamentos de 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); }
Se alguém está se perguntando, a variável "btc_acc_adress" é uma String (com endereço BTC), amountBTC é um double, com, é claro, o valor da transação.
fonte
zxing não fornece (apenas) uma API da web; na verdade, é o Google fornecendo a API, a partir do código-fonte que mais tarde foi aberto no projeto.
Como Rob diz aqui, você pode usar o código-fonte Java para o codificador de código QR para criar um código de barras bruto e, em seguida, renderizá-lo como um bitmap.
Posso oferecer uma maneira mais fácil ainda. Você pode chamar o Barcode Scanner por intenção para codificar um código de barras. Você precisa de apenas algumas linhas de código e duas classes do projeto em
android-integration
. O principal é IntentIntegrator . Basta ligarshareText()
.fonte
java.awt
, ou se conecta à web, e você pode vê-lo usado no aplicativo Barcode Scanner - no Android, sem uma conexão com a internet. @Razgriz não ele não retorna a imagem, mas mostra a imagem na tela para você. O usuário pode salvar a imagem.