Integrando o Leitor de QRCode ZXing no Android

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog. Você receberá um email de confirmação. Somente depois de confirma-lo é que poderei lhe enviar os conteúdos exclusivos.

Email inválido.
Blog /Android /Integrando o Leitor de QRCode ZXing no Android

Integrando o Leitor de QRCode ZXing no Android

Vinícius Thiengo
(17366) (46) (1) (1)
Go-ahead
"Não podemos estar em modo de sobrevivência. Temos de estar no modo de crescimento."
Jeff Bezos
Kotlin Android
Capa do livro Desenvolvedor Kotlin Android - Bibliotecas para o dia a dia
TítuloDesenvolvedor Kotlin Android - Bibliotecas para o dia a dia
CategoriasAndroid, Kotlin
AutorVinícius Thiengo
Edição
Ano2018
Capítulos19
Páginas1035
Acessar Livro
Treinamento Oficial
Android: Prototipagem Profissional de Aplicativos
CursoAndroid: Prototipagem Profissional de Aplicativos
CategoriaAndroid
InstrutorVinícius Thiengo
NívelTodos os níveis
Vídeo aulas186
PlataformaUdemy
Acessar Curso
Receitas Android
Capa do livro Receitas Para Desenvolvedores Android
TítuloReceitas Para Desenvolvedores Android
CategoriaDesenvolvimento Android
AutorVinícius Thiengo
Edição
Ano2017
Capítulos20
Páginas936
Acessar Livro
Código Limpo
Capa do livro Refatorando Para Programas Limpos
TítuloRefatorando Para Programas Limpos
CategoriaEngenharia de Software
AutorVinícius Thiengo
Edição
Ano2017
Capítulos46
Páginas599
Acessar Livro
Quer aprender a programar para Android? Acesse abaixo o curso gratuito no Blog.
Conteúdo Exclusivo
Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
Email inválido

Opa, blz?

Nesse vídeo mostro como ler códigos de barra, QRCode e cia. diretamente da APP Android sem a necessidade de chamar via Intent uma outra APP para auxiliar na leitura do código. Há outras formas de ter essa funcionalidade internamente em nossa APP, mas enfim, utilizo para isso o projeto Open Source ZXing (segundo eles pronuncia-se Zebra Crossing) que é desenvolvido em Java, tem suporte para várias outras linguagens e lê os respectivos códigos de barra 1D / 2D: 1D (UPC-A, UPC-E, EAN-8, EAN-13, Code 39, Code 93, Code 128, Codabar, ITF, RSS-14, RSS-Expanded), 2D (QR Code, Data Matrix, Aztec, PDF 417).

Como no projeto apresentado no vídeo nós queremos que o leitor de código execute exatamente dentro de nossa APP, temos de realizar algumas alterações no projeto ZXing além de termos de copiar uma série de arquivos (dos folders originais /src/ e /res/) para dentro nosso projeto para que. Fique atento quanto as permissões que necessárias para que a câmera seja utilizada pelo código do ZXing. Note que é possível fazer muito mais alterações e não somente na classe CaptureActivity como fiz no vídeo, depende mesmo é das necessidades de seu projeto. Então é isso, vou evitar mais delongas e deixar você assistir ao vídeo.

O link para download do projeto se encontra logo abaixo no post.

Segue link das páginas apresentadas no vídeo:

Página do projeto ZXing no Google Code

Página do projeto ZXing no GitHub

Página do Maven para download do cor.jar

Página de gerador de códigos para testes

Vlw

Receba em primeira mão, e com prioridade, os conteúdos Android exclusivos do Blog.
Email inválido

Relacionado

Iniciando com Dropbox API no AndroidIniciando com Dropbox API no AndroidAndroid
Download e Upload com Dropbox API no AndroidDownload e Upload com Dropbox API no AndroidAndroid
ExpandableListView no Android, Entendendo e UtilizandoExpandableListView no Android, Entendendo e UtilizandoAndroid
DialogFragment no Android, Entendendo e UtilizandoDialogFragment no Android, Entendendo e UtilizandoAndroid

Compartilhar

Comentários Facebook (10)

Comentários Blog (36)

Para código / script, coloque entre [code] e [/code] para receber marcação especifica.
Forneça seu nome válido.
Forneça seu email válido.
Forneça o comentário.
Enviando, aguarde...
Antonio (2) (0)
05/06/2018
Boa noite Thiengo! Parabéns pelo conteúdo.  Gostaria de tirar uma dúvida, caso seja possível!  Estou desenvolvendo um aplicativo e gostaria que o leitor  de código de barras leia diferentes códigos e que o mesmo armazene em ediText diferentes! Consigo até capturar diferentes código, porém, toda vez que capturo um o outro campo limpa os dados. Desde de já grato!
Responder
Vinícius Thiengo (1) (0)
06/06/2018
Antonio, tudo bem?

O que você quer é preencher um EditText diferente para cada código lido, certo?

Se sim, essa funcionalidade está ligada a lógica de negócio que você desenvolverá para ser executada assim que algum código válido for retornado da leitura do ZXing.

Um possível roteiro é o seguinte:

-> Acesse, como variável de instância da atividade ou fragmento que contém o método de resposta do ZXing, o ViewRoot que conterá os EditTexts com os códigos lidos. Acesse esse ViewRoot com o método findViewById();

-> No método de resposta do ZXing, depois de verificado que o código lido é válido, adicione ao ViewRoot um novo EditText ao final dele, como a seguir:

...
EditText et = new EditText( this ); // ou getActivity() em caso de Fragment
et.setText( codigoLidoEmFormatoString );
viewRoot.addView( et );
...

Antonio, dessa forma sempre haverá um novo EditText para um novo código lido. Tente o roteiro acima.

Não deixe de ver o conteúdo do link a seguir onde mostro como melhor utilizar o ZXing em um projeto Android:

-> Leitor de Códigos no Android com Barcode Scanner API - ZXing: https://www.thiengo.com.br/leitor-de-codigos-no-android-com-barcode-scanner-api-zxing

Abraço.
Responder
Antonio (1) (0)
14/06/2018
Olá Thiengo,

Tudo bem com você?

Desde de já muito obrigado pela dica que você me passou no seu site.

Porém, ainda não conseguir aplicar ao meu projeto a dica que você me passou!

Os dois vídeos que você gravou no seu canal, pelo menos os que eu assistir que são relacionados ao Zxing estão diferentes do que estou construindo.

Estou anexando a minha Actvity Principal, e se for possível poderia me dizer no que estou errando e como seria a melhor saída para essa minha problemática.



Antemão, deixo aqui mais uma vez e o meu muito OBRIGADO!


Atenciosamente,


Antonio da Hora


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////

public class Activity_Pai extends AppCompatActivity implements TextView.OnEditorActionListener  {

    private ZXingScannerView scannerView;
    private  ZXingScannerView scannerView2;

    EditText serialTablet;
    EditText serialImpressora;


    ImageButton btnTb;
    ImageButton btnTi;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity__pai);

        //imagem button
        btnTb =  (ImageButton) findViewById(R.id.cod_tablet);
        btnTi =  (ImageButton) findViewById(R.id.cod_Impressora);


    }


    //Função onClick do ImageButton IMEI TABLET
    public void scanTablet (View view, ViewGroup viewRoot)
    {

        scannerView = new ZXingScannerView(this);
        scannerView.setResultHandler(new ZXingScannerResultHandler());

        setContentView(scannerView);
        scannerView.startCamera();

        EditText et = new EditText(this);

        et.setText(serialTablet.toString());

        viewRoot.addView(et);

    }

    //Funcção onClick do ImageButton IMEI impressora
    public void scanImpressora(View view)
    {

        scannerView2 = new ZXingScannerView(this);
        scannerView2.setResultHandler(new ZXingScannerResultHandler2());

        setContentView(scannerView2);
        scannerView2.startCamera();


        }


    @Override
    public void onPause()
    {
        super.onPause();
        scannerView.stopCamera();

    }


    class ZXingScannerResultHandler implements ZXingScannerView.ResultHandler {

        @Override
        public void handleResult(Result result) {

                String codigoImei = result.getText();

                Toast.makeText(Activity_Pai.this, codigoImei, Toast.LENGTH_SHORT).show();

                setContentView(R.layout.activity__pai);
                scannerView.stopCamera();

                //CAMPO SERIAL DO TABLET
                serialTablet = findViewById(R.id.imeTablet);

                serialTablet.setText(codigoImei);



        }
    }

    class ZXingScannerResultHandler2 implements ZXingScannerView.ResultHandler {

        @Override
        public void handleResult(Result result) {

                String serialImep = result.getText();

                Toast.makeText(Activity_Pai.this, serialImep, Toast.LENGTH_SHORT).show();

                setContentView(R.layout.activity__pai);
                scannerView.stopCamera();

                //CAMPO SERIAL DO Impressora
                serialImpressora = findViewById(R.id.imeiImpressora);

                serialImpressora.setText(serialImep);

        }
    }



}
Responder
Vinícius Thiengo (1) (0)
21/06/2018
Antonio, tudo bem aqui.

O que vi que pode ser mudado para atender ao que você tinha informado no primeiro comentário, é:

Colocar o código a seguir:

EditText et = new EditText( this );
et.setText( serialTablet.toString() );
viewRoot.addView( et );

No handleResult() de ZXingScannerResultHandler ao invés de no método scanTablet().

Assim, para cada novo código lido via scannerView, um novo EditText será adicionado em tela com o valor do código.

É possível ter o mesmo comportamento para scannerView2 / ZXingScannerResultHandler2.

Abraço.
Responder
Antonio (1) (0)
25/06/2018
Boa noite.

Tudo em paz com você ?

Segui o seu conselho, porém, há dois erros que sinceramente não estou conseguindo resolve-los.

Segue o erros.

///////////////////////////////////////////////////////////////////////////////////////////////////////////

class ZXingScannerResultHandler implements ZXingScannerView.ResultHandler
    {

        @Override
        public void handleResult(Result result)
        {

                String codigoImei = result.getText();

                Toast.makeText(Activity_Pai.this, codigoImei, Toast.LENGTH_SHORT).show();

                setContentView(R.layout.activity__pai);
                scannerView.stopCamera();

                //CAMPO SERIAL DO TABLET
                serialTablet = findViewById(R.id.imeTablet);

                 serialTablet.setText(codigoImei);

                 EditText et = new EditText(this);

//EditText (android.content.Context) in EditText cannot be applied  to                                                      //(com.app.antonio.atena.Activity_Pai.ZXingScannerResultHandler)

                  et.setText(serialTablet.toString());
                  viewRoot.addView(et); // Cannot resolve symbol 'viewRoot'

        }
    }

Quando altero o viewRoot, pelo scanView o erro desaperece, mas mesmo assim o editText permanece com o mesmo erro.

Quero agradecer mais uma vez pela sua atenção e ajuda.

Eternamente Grato!

Grande Abraço!

Att.
Responder
Vinícius Thiengo (0) (0)
31/07/2018
Antonio, tudo bem aqui.

O trecho de código "EditText et = new EditText(this);" realmente está errado, pois o "this" está representando uma instância de ZXingScannerResultHandler ao invés de uma instância de Context, como esperado no construtor de EditText.

Nem que seja pelo construtor de ZXingScannerResultHandler, passe o contexto da atividade como parâmetro para assim poder passa-lo como argumento em new EditText( context ).

Se ZXingScannerResultHandler estiver como classe interna da atividade de contexto, então basta fazer:

...
EditText et = new EditText( NomeDaActividade.this );
...

Dessa forma o projeto vai funcionar sem problemas.

Abraço.
Responder
Antonio (1) (0)
13/08/2018
Boa noite Thiengo, tudo bem contigo!

Irei aplicar a sua sugestão ao projeto.

Desde de já muito obrigado pela sua atenção e prestatividade!

Grande Abraço!
Responder
31/01/2018
Bom dia amigo
estou com uma duvida, tem como fazer um link em Qrcode abrir no navegador padrão, utilizando essa implementação? e como funcionaria isso? abraço.
Responder
Vinícius Thiengo (0) (0)
03/02/2018
Edian, tudo bem?

Tem como sim. Um possível roteiro é o seguinte: No onActivityResult() da classe CaptureActivity você pode colocar o código de abertura de browser.

-> Código da classe CaptureActivity: https://github.com/viniciusthiengo/test-zxing/blob/master/android_zxing/src/main/java/com/google/zxing/client/android/CaptureActivity.java

-> Código de abertura de página Web no browser padrão do device: https://stackoverflow.com/a/3004542/2578331

Abraço.
Responder
André (1) (0)
10/05/2017
Olá Thiengo, tenho acompanhado muito seu blog e videos no youtube. Desde já agradeço as ótimas dicas para quem está programando para android.
Eu estou migrando do Eclipse para o Android Studio e estou tendo certa dificuldade de me adaptar.
Cheguei a ver na internet como usar o ZXing no AS mas os videos que ví o pessoal só passa uma linha no gradle e não faz o procedimento similar o do seu projeto do Eclipse. Poderia dar uma dica sobre montar no AS do mesmo jeito que foi feito no Eclipse e também, se possivel,uma dica de como fazer deste modo somente mexendo no gradle?
Obrigado
Responder
Vinícius Thiengo (0) (0)
12/05/2017
André, tudo bem?

Realmente há maneiras mais simples de se configurar o ZXing no Android, digo, utilizando Gradle e o Android Studio.

Apesar de eu ter cessado o trabalho com essa API, há inúmeras libraries que facilitam a configuração dela em nosso projeto Android. Veja algumas no link a seguir: https://android-arsenal.com/search?q=zxing

Nas páginas das libraries do link acima há instruções de como configura-las no Gradle, incluindo a API Android mínima de uso.

André, se quiser um projeto mais atual, no Android Studio, utilizando o ZXing, veja a minha conversão com Davi Resio no link a seguir: https://www.youtube.com/watch?v=WCR_GaROfSA

Depois entre no GitHub desse projeto em: https://github.com/viniciusthiengo/test-zxing

Abraço.
Responder
Alexandre (0) (0)
28/04/2016
Tem como disponibilizar seu código pronto para download?
Responder
Vinícius Thiengo (0) (0)
28/04/2016
Fala Alexandre, blz?
O código está na sessão "Download" desse post, somente click para baixar. De qualquer forma esse post está um pouco antigo, utilize o ZXing de alguma das libraries desse link (https://android-arsenal.com/search?q=zxing ). Abraço
Responder
Carlos (0) (0)
27/04/2016
Olá, parabéns pelo material.
  Ao tentar efetuar a leitura de Código de Barra EAN 13 a rotina não lê o último nro.
  Será que tem algum outro controle que deve ser ajustado?

Obrigado.
Responder
Vinícius Thiengo (0) (0)
28/04/2016
Fala Carlos, blz?
Vou ficar lhe devendo essa, mas se seguiu esse post recomendo que utilize alguma das libraries desse link (https://android-arsenal.com/search?q=zxing ), pois elas são mais atuais e simples de utilizar. Abraço
Responder
17/12/2015
Olá Vinícius Thiengo, estou com algumas dúvidas sobre alguns métodos que a biblioteca dispõe, queria saber se tem algum doc ou pdf, falando mais sobre ela, pois já procurei e não consegui encontrar! Desde de já agradeço!
Responder
Vinícius Thiengo (0) (0)
18/12/2015
Fala Patrick, blz?
Tem o GitHub da lib (https://github.com/zxing/zxing )... de qualquer forma, dê uma olhada nessa implementações tb (https://android-arsenal.com/search?q=zxing ). Abraço
Responder
Carlos Andrade (1) (0)
10/08/2015
Thiengo, beleza!? Você tem alguma lib para manipular PDF no Android?
Responder
Vinícius Thiengo (0) (0)
11/08/2015
Fala Carlos Andrade, blz?
Ainda não tenho esse conteúdo, mas dê uma olhada nessas lbs: https://android-arsenal.com/search?q=pdf
Responder
Erick Costa (1) (0)
26/03/2015
Fale Thiengo, parabéns pelo tutorial.
Eu consigo fazer rodar no Android 2.3 numa boa?
Consegui importar para o Android Studio, rodou legal mas não tive compatibilidade com o Android 2.3
Responder
Vinícius Thiengo (0) (0)
26/03/2015
Fala Erick, blz?
Não cheguei a testar para aversão 2.3, mas se no LogCat saiu algo relacionado a ClassNotFound então não roda mesmo não e mt provavelmente não há a versão de suporte. Mas essa é uma versão que está cada vez mais com menos usuários (https://developer.android.com/about/dashboards/index.html ). Abraço
Responder
Matheus Pereira (1) (0)
09/03/2015
Olá Thiengo, sou leigo em programação e estou utilizando o Android Studio.. Não sei como criar o source folder no Anroid Studio. Poderia me dar uma dica?
Responder
Vinícius Thiengo (0) (0)
10/03/2015
Fala Matheus, blz?
Para ficar mais tranquilo de visualizar, faça o seguinte, na aba de projetos de seu AS, no topo tem um menu drop down, clique nele e selecione "Project" ao invés de Android, a visualização será mt similar a que temos quando no Eclipse. Então navegue em seu projeto até o folder /res/, nele clique com o botão direito do mouse  e vai em New > Directory. Agora é somente da o nome. Abraço
Responder
Vinícius Thiengo (0) (0)
10/03/2015
Se quiser criar para colocar o ZXing como no vídeo, faça o mesmo procedimento citado em meu primeiro comentário, porém depois de selecionar project, clique com o botão direito em cima do folder root de seu projeto e selecione New > Module. Com o ZXIngo no ANdroid studio, se não me engano vc pode utilizar o Gradle, veja essa discussão no stackoverflow (http://stackoverflow.com/questions/23575559/add-zxing-android-project-as-library-in-android-studio ). Abraço
Responder
Matheus (1) (0)
10/03/2015
Muito obrigado.. ajudou bastante!
Responder
Wemerson Vital (0) (0)
24/11/2014
Olá Thiengo, continue com este seu trabalho ele vem ajudando muito inclusive há min.

Eu não estou conseguindo fazer como que a activity que captura o QR Code fique de forma vertical, ela sempre fica com a câmera invertida,  queria saber como modificar isso
vlw , abraço!
Responder
Vinícius Thiengo (0) (0)
26/11/2014
Fala Wemerson, blz?
Entra na classe CaptureActivity e procure pela instancia de camera para aplicar o mesmo que a resposta do link a seguir ( http://stackoverflow.com/questions/10660598/android-camera-preview-orientation-in-portrait-mode ). Se mesmo assim não conseguir volte aqui que vou ver no projeto como resolver isso (deve ser detalhe simples)... abraço
Responder
Wemerson Vital (1) (0)
09/12/2014
Valeu Thiengo, ajudou bastante...
Abraço!
Responder
Denilson Alves (0) (0)
12/10/2014
Thiengo, boa noite tudo certo? Então eu consegui integrar as classes do zxing ao meu projeto, ele chama a tela de leitura tudo certinho, porém quando ele termina de ler o códigoQR ele não executa o método onactivityResult, ou seja ele só lê e a tela do leitor fica parada com o resultado, você saberia me dizer se tem solução?? Baixei o seu projeto e ele executa normalmente, pega o resultado e joga no TextView.. no meu ele não faz nada com o resultado só fica mostrando na tela. .. Se puder me ajudar eu agradeço desde já
Responder
Vinícius Thiengo (0) (0)
12/10/2014
Fala Denilson, blz?
Então, vc provavelmente esqueceu de realizar alguma alteração na Activity CaptureActivity que está no pacote do zxing, pois nessa parte que ele fica mostrando o código na tela, no vídeo eu faço com que a Activity seja fechada para então retornar o dados lido para o método onActivityResult. Verifique a CaptureActivity de meu projeto e então verifique a de seu projeto para que elas sejam as mesmas. Abraço
Responder
Denilson Alves Martins (1) (0)
12/10/2014
A preguiça é uma coisa muito chata, não tinha visto o vídeo até o fim .... :[ ... agora deu certo obrigado Thiengo.. vc é o cara mano..sucesso
Responder
paulohenriquess2014 (1) (0)
20/09/2014
muito bom cara valeu pelo seus videos, estou aprendendo muito.
Responder
Wiliam (1) (0)
17/09/2014
Muito interessante cara, seu blog ta muito bom! Obrigado por compartilhar todo esse conhecimento com a gente!
Responder
Vinícius Thiengo (0) (0)
18/09/2014
Vlw Wilian, abraço
Responder
Wiliam (0) (0)
19/09/2014
Opa vlw, Thiengo deixa só eu tirar uma duvida com vc! Eu estou desenvolvendo uma app que vai funcionar com um chat de grupo, tipo aqueles grupos do whatsapp onde vários usuários se conectam em uma sala, então pra fazer isso vc me recomendaria usar sockets ou existe uma forma melhor de se fazer? Desde já agradeço pela atenção, Abraços...
Responder
Vinícius Thiengo (1) (0)
19/09/2014
Fala Wilian, blz?
Então, eu faria uma jogada com o Volley, Google Cloud Message (GCM) e Service, ou seja, Volley para trabalhar as conexões necessárias com o servidor Web (é a lib recomendada pelo Google), o GCM para informar aos usuários que há novas mensagens e o Service para buscar essas novas mensagens tendo em vista a limitação no tamanho da mensagem enviada pelo GCM. Abraço
Responder