Necesito crear un código QR en mi aplicación de Android y necesito una biblioteca o código fuente que me permita crear un código QR en una aplicación de Android.
La biblioteca que necesito debe:
- no dejar una marca de agua (como
onbarcode
biblioteca) - no use la API del servicio web para crear el código qr (como la biblioteca zxing de Google)
- no necesita instaladores de terceros (como QR Droid)
Ya creé dicho código para iPhone (Objective-C) pero necesito una solución rápida para Android hasta que tenga tiempo de hacer mi propio generador de códigos QR. Es mi primer proyecto de Android, por lo que se agradecerá cualquier ayuda.
Respuestas:
¿Ha mirado ZXING ? Lo he estado usando con éxito para crear códigos de barras. Puede ver un ejemplo de trabajo completo en la aplicación 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 }
fuente
con zxing este es mi código para crear 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(); }
fuente
Bitmap.createBitmap
.Tal vez este tema antiguo, pero encontré que esta biblioteca es muy útil y fácil de usar
QRGen
ejemplo para usarlo en Android
Bitmap myBitmap = QRCode.from("www.example.org").bitmap(); ImageView myImage = (ImageView) findViewById(R.id.imageView); myImage.setImageBitmap(myBitmap);
fuente
implementation 'com.github.kenglxn.QRGen:android:[version]'
e importar la clase QRCode como esta:import net.glxn.qrgen.android.QRCode
¡Aquí está mi función simple y funcional para generar un mapa de bits! ¡Solo uso ZXing1.3.jar! ¡También configuré el Nivel de corrección en Alto!
PS: xey están invertidos, es normal, porque bitMatrix invierte xey. Este código funciona perfectamente con una imagen cuadrada.
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
Es más rápido usar bitmap.setPixels (...) con una matriz de píxeles int en lugar de bitmap.setPixel uno por uno:
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);
fuente
Usé zxing-1.3 jar y tuve que hacer algunos cambios implementando el código de otras respuestas, así que dejaré mi solución para otros. Hice lo siguiente:
1) busque zxing-1.3.jar, descárguelo y agregue propiedades (agregue un jar externo).
2) en mi diseño de actividad agregue ImageView y asígnele un nombre (en mi ejemplo fue tnsd_iv_qr).
3) incluir código en mi actividad para crear una imagen qr (en este ejemplo, estaba creando QR para pagos con 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); }
Si alguien se pregunta, la variable "btc_acc_adress" es una Cadena (con dirección BTC), amountBTC es un doble, con, por supuesto, el monto de la transacción.
fuente
zxing no proporciona (solo) una API web; en realidad, Google proporciona la API, a partir del código fuente que luego fue de código abierto en el proyecto.
Como Rob dice aquí, puede usar el código fuente de Java para el codificador de código QR para crear un código de barras sin procesar y luego representarlo como un mapa de bits.
Todavía puedo ofrecer una forma más fácil. Puede llamar a Barcode Scanner por intención para codificar un código de barras. Solo necesita unas pocas líneas de código y dos clases del proyecto, debajo
android-integration
. El principal es IntentIntegrator . Solo llamashareText()
.fuente
java.awt
ni se conecta a la web, y puede verlo usado en la aplicación Barcode Scanner, en Android, sin conexión a Internet. @Razgriz no, no devuelve la imagen, pero muestra la imagen en la pantalla. El usuario puede guardar la imagen.