terça-feira, 27 de outubro de 2009

Lendo códigos de barra com Android


Você está precisando desenvolver um aplicativo que faça a leitura de um código de barras utilizando a câmera do celular ?

Provavelmente você está pensando em desenvolver algo com a câmera, e pegar alguma biblioteca que faça o decode do código de barras. Sim, isto é possível.

Mas estamos falando do Android, e um dos principais recursos da plataforma se trata de chamar outra aplicação já instalada para fazer determinada tarefa para você.


Neste caso existe o projeto zXing que possui um aplicativo Android que pode ser instalado no seu celular que já faz todo este trabalho, basta fazer o download e instalar o BarcodeScanner.apk no seu celular.
** Olá leitores, se você conseguiu ler a imagem do lado, a promoção já acabou e o vencendor já ganhou o livro **

E agora como fazemos para usufruir deste aplicativo?

Simples, imagina que você possui um botão na tela.


ImageButton b = (ImageButton) findViewById(R.id.btScan);
b.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.google.zxing.client.android.SCAN");
startActivityForResult(intent, 0);
}
});

Se você é um desenvolvedor Android já entendeu a "mensagem". No Android temos o recurso de expressar as nossas intenções utilizando a classe Intent, de forma que a nossa intenção e desejo é informada ao sistema operacional do Android, e ele se encarrega de entregar esta mensagem a todas as aplicações instaladas no celular.

Neste caso como a aplicação de leitura de código de barras está instalada, ela responderá a sua mensagem "com.google.zxing.client.android.SCAN" e será executada, e passa a interagir com o usuário.

O usuário pode utilizar esta aplicação normalmente, e quando terminar de ler o código de barras, sua aplicação (Activity) será chamada novamente, e o método onActivityResult é utilizado para ler o resultado, que neste caso é o código de barras e outras informações em formato texto.

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
if (requestCode == 0) {
if (resultCode == RESULT_OK) {
String contents = intent.getStringExtra("SCAN_RESULT");
String format = intent.getStringExtra("SCAN_RESULT_FORMAT");

É isso aí. Muito simples não é? Bem mais fácil do que criar uma aplicação do zero, ou até mesmo utilizar uma biblioteca (API) para isso. Desta forma você deixa o trabalho do código de barras para uma aplicação especializada nesta tarefa.

No Android, a "Integração de Aplicações" é levado mesmo a sério. Este é um simples exemplo.. se você desenvolve para Android já deve saber disso.

6 comentários:

  1. Cara, tenho um probleminha
    nao consigo instalar esse apk de jeito nenhum
    existe algum tutorial explicando como que instala ?
    já fiz algum mas ele nao cai nesse pacote com.google.zxing.client.android.SCAN

    se tiver agradeço

    ResponderExcluir
  2. Oi Lecheta,

    Estava testando esse exemplo, mas quando eu mando escanear um código de barras, ele diz "Este produto não foi encontrado em nossa base de dados".

    Não tem um jeito dele simplesmente ler e retornar o código de barras?

    4br4ç05,
    nglauber

    ResponderExcluir
    Respostas
    1. Glauber.

      tenta assim:

      @Override
      public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.main);

      Button test_btn = (Button) findViewById(R.main.test_btn);
      test_btn.setOnClickListener(new View.OnClickListener() {

      @Override
      public void onClick(View v) {
      Intent intent = new Intent("com.google.zxing.client.android.SCAN");
      intent.putExtra("SCAN_MODE", "ALL_CODE_TYPES");
      try {
      startActivityForResult(intent, 0);
      }
      catch(ActivityNotFoundException e) {
      // ALERT USER. ZXING MUST BE INSTALLED TO USE
      }
      }
      });
      }

      public void onActivityResult(int requestCode, int resultCode, Intent intent) {
      if (requestCode == 0) {
      if (resultCode == RESULT_OK) {
      String contents = intent.getStringExtra("SCAN_RESULT");
      String format = intent.getStringExtra("SCAN_RESULT_FORMAT");
      } else if (resultCode == RESULT_CANCELED) {

      }
      }
      }

      Excluir
  3. Como faço para pegar o nome do produto depois de ler o codigo de barras? ele pega apenas o numero do código. meu email: lucas.henrard@gmail.com

    ResponderExcluir
    Respostas
    1. Olá, o código de barras é apenas números mesmo, para ter os dados do seu produto, vc precisa ter essas informações na base de dados e o numero do código de barras vinculado ao cadastro do produto, assim ao ler o código de barras vc vai até a base de dados com o mesmo e localiza os dados do produto.

      Excluir
  4. Boa tarde, tenho uma aplicação simples que cria apenas uma webview e dentro desta roda uma página html. Gostaria de acrescentar ao meu app um botão para ler código de barras, e ao ler este, o input html que estaria com o foco da webview recebesse o código lido. Existe uma maneira de fazer isso?
    Repare que meu app terá apenas uma webview e um botão, o restante roda pela página html.
    Desde já obrigado pela atenção.
    Abraço
    Ezequiel

    ResponderExcluir