¿Cómo generar un código QR para una aplicación de Android? [cerrado]

92

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:

  1. no dejar una marca de agua (como onbarcodebiblioteca)
  2. no use la API del servicio web para crear el código qr (como la biblioteca zxing de Google)
  3. 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.

Radu
fuente
podría usar zxing en su código abierto
nandeesh
2
zxing no es una API web, en realidad, consulte a continuación
Sean Owen
1
Pruebe mi aplicación de prueba simple para generar mapas de bits QR aquí: stackoverflow.com/a/30529519/165071
Alexander Farber

Respuestas:

68

¿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 }
Robar
fuente
He bifurcado el código abierto de bitcoin de github y lo probé en mis dispositivos Android 2.2, fuerza de aplicación cerrada, ¿hay algún problema?
Roy Lee
Lo siento, no he visto esa aplicación durante más de un año. Como mencionó Sean a continuación, consulte la fuente del codificador zxing aquí: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Rob
@Rob, ¿generará un código QR del número definido por el usuario? único número o número con laphabets
Erum
@Erum creará un código de barras para la mayoría de las cadenas alfanuméricas que proporcione
Rob
Use esto: implementación 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
97

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();
    }
Stefano
fuente
Trabajó para mi. Fácil de agregar.
Roon13
Gracias. Trabaja para mi.
RoShan Shan
@Stefano ¿Puede generar n no. de código QR único?
Ashish Tiwari
Funcionó como un encanto g88 !! +1 ¿Hay alguna opción en la que pueda agregar algún logo a esto?
Amit
1
para evitar pérdidas de memoria, no olvide administrar la memoria de mapa de bits que está creando Bitmap.createBitmap.
gMale
43

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);
Antwan
fuente
2
¡Esta es una solución fácil y funcional!
Zohab Ali
5
.bitmap () no se encuentra
Marcel Adel
Debe usar la dependencia de Android: implementation 'com.github.kenglxn.QRGen:android:[version]' e importar la clase QRCode como esta:import net.glxn.qrgen.android.QRCode
anro
2
Error al resolver: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan
2
En su proyecto build.gradle agregue maven {url " jitpack.io "} a allprojects.repositiories
tagy22
18

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

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.

Adam Staszak
fuente
Use esto: implementación 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
5

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 llama shareText().

Sean Owen
fuente
tanques, esto parece útil, solo espero evitar cualquier API web, que podría ser un poco incómodo, en modo fuera de línea para mi aplicación, pero esto es muy prometedor, lo investigaré
Radu
No estoy seguro de que era clara pero estoy diciendo que las opciones ZXing qué no implican ninguna API web
Sean Owen
No, usa algunas bibliotecas que no están disponibles en Android, como java.awt
siemanko
Hola, perdón por necro este hilo, creo que es mejor si solo hago una pregunta aquí. Tengo la aplicación de escáner de código de barras de ustedes (la estoy usando para escanear un código QR) y si obtengo esta respuesta correcta, podría hacer lo mismo, abrir el escáner de código de barras a través de la intención con diferentes argumentos y devolvería un ¿Código QR de mapa de bits para mostrar?
Razgriz
1
@nivwusquorum, no, el codificador no usa java.awtni 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.
Sean Owen