Como gerar um QR Code para um aplicativo Android? [fechadas]

93

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:

  1. não deixar marca d'água (como onbarcodebiblioteca)
  2. não use a API de serviço da web para criar o qrcode (como a biblioteca zxing do Google)
  3. 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.

Radu
fonte
você poderia usar zxing como código aberto
nandeesh
2
zxing não é uma API web, na verdade, veja abaixo
Sean Owen
1
Experimente meu aplicativo de teste simples para gerar bitmap QR aqui: stackoverflow.com/a/30529519/165071
Alexander Farber

Respostas:

69

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 }
Roubar
fonte
Eu fiz o bifurcação do código-fonte aberto do bitcoin no github e testei nos meus dispositivos Android 2.2, força do aplicativo fechada, algo errado?
Roy Lee,
Desculpe, eu não vejo esse aplicativo há mais de um ano. Conforme mencionado abaixo por Sean, verifique a fonte do codificador zxing aqui: code.google.com/p/zxing/source/browse/trunk#trunk/core/src/com/…
Rob
@Rob irá gerar o código QR do número definido pelo usuário? apenas o número ou o número com laphabets
Erum
@Erum irá criar um código de barras para qualquer string alfanumérica que você fornecer
Rob
Use isto: implementação 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
98

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();
    }
Stefano
fonte
Funcionou para mim. Fácil adição.
Roon13
Te agradece. Trabalhe para mim.
RoShan Shan
@Stefano Pode gerar n não. de código QR exclusivo?
Ashish Tiwari
Funcionou como um encanto g88 !! +1 Existe alguma opção em que eu possa adicionar algum logotipo a isso?
Amit
1
para evitar vazamentos de memória, não se esqueça de gerenciar a memória de bitmap que está sendo criada pelo Bitmap.createBitmap.
março
43

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);
Antwan
fonte
2
Esta é uma solução fácil e funcional!
Zohab Ali
6
.bitmap () não foi encontrado
Marcel Adel
Você deve usar a dependência do Android: implementation 'com.github.kenglxn.QRGen:android:[version]' e importar a classe QRCode assim:import net.glxn.qrgen.android.QRCode
anro
2
Falha ao resolver: com.github.kenglxn.QRGen: android: 2.6.0
M. Usman Khan
2
Em seu projeto build.gradle adicione maven {url " jitpack.io "} a allprojects.repositiories
tagy22
18

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

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.

Adam Staszak
fonte
Use isto: implementação 'me.dm7.barcodescanner: zxing: 1.9.13'
M. Usman Khan
5

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

Sean Owen
fonte
tanques isso parece útil, só espero ignorar qualquer API da web, que pode ser um pouco desconfortável, no modo offline para meu aplicativo, mas isso é muito promissor, vou dar uma olhada
Radu
Não tenho certeza se fui claro, mas estou dizendo que as opções zxing não envolvem nenhuma API da web
Sean Owen
Não, ele usa algumas bibliotecas disponíveis no Android, como java.awt
siemanko
Olá, desculpe por necro este tópico, acho melhor se eu apenas fizesse uma pergunta aqui. Eu tenho o aplicativo Barcode Scanner de vocês (estou usando-o para escanear um QR Code) e se acertasse a resposta, poderia simplesmente fazer o mesmo, abrir o Barcode Scanner via intent com diferentes argumentos e ele retornaria um Código QR de bitmap para exibição?
Razgriz de
1
@nivwusquorum, não, o codificador não usa 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.
Sean Owen