java

Leer código QR con Android | Programación de app

Introducción

Leer un código QR debería ser lo más fácil de hacer en Android utilizando Java, pero no es así.

Podemos utilizar la API que ha introducido Google para leer códigos QR, pero el usuario final necesitará tener los Google Play Services.

Otras alternativas sugieren que usemos otra aplicación que ya lea códigos QR (llamar a otra aplicación desde la nuestra) y tomar lo que devuelva; esto confiando en que el usuario tenga una aplicación para leer dichos códigos.

Pero hoy veremos cómo podemos incorporar un lector QR programado por alguien más, que no tiene dependencias más que el mismo lector.

App final

La app que crearemos al final se verá algo así:

Puedes descargarla y probarla por ti mismo.

Incluir librería

Comencemos con lo básico. La librería está alojada aquí en GitHub. No es muy popular ni tiene miles de estrellas, pero sí que sirve.

Para incluirla, abrimos el archivo build.gradle (el que dice Project:TuProyecto) y en el apartado allprojects > repositories agregamos lo siguiente:

maven { url 'https://jitpack.io' }

De manera que ese fragmento de nuestro archivo puede quedar así:

allprojects {
    repositories {
        jcenter()
        maven { url 'https://jitpack.io' }
    }
}

Personalmente, y sólo para que sirva de guía, mi archivo se ve así:

Ahora modificaremos nuestro archivo gradle para nuestra app (dice Module: app), en el apartado dependencies. En ese apartado agregaremos lo siguiente:

compile 'com.github.blikoon:QRCodeScanner:0.1.2'

De manera que el fragmento  puede quedar así:

dependencies {
    compile 'com.github.blikoon:QRCodeScanner:0.1.2'
}

Y aquí una imagen del mío:

Seguramente nos pedirá que instalemos las dependencias en un mensaje en la parte superior,  así que lo hacemos haciendo click en Sync Now. Una vez hecho esto ya hemos incluido la librería.

Solicitando permisos

El autor de la librería no lo deja claro, pero necesitamos dos permisos: acceder a la cámara y a la vibración. Cuando comencé a probar la librería, habilité permisos para la cámara, pero no para que el dispositivo vibrase, así que la app se cerraba inesperadamente.

En fin, recordemos agregarlos en el manifest. Así:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.VIBRATE" />

El mío luce así:

Y con ello ya podemos, ahora sí, programar.

Leer código QR

Hagamos un ejemplo básico. Vamos a poner un botón, cuando se haga click en ese botón llamaremos a un método de Java que lanzará el lector, luego recuperaremos lo que se devuelva y lo mostraremos en un Toast.

Botón

Voy a poner un simple botón en la vista y también una etiqueta. Vamos a escuchar más tarde el click del botón, en dicho click se llamará al método onClick.

La vista queda así:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="me.parzibyte.ejemplolectorqr.MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="parzibyte.me"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintHorizontal_bias="0.051"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.967" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="onClick"
        android:text="Abrir lector"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        tools:layout_editor_absoluteX="97dp"
        tools:layout_editor_absoluteY="134dp" />

</android.support.constraint.ConstraintLayout>

Actividad

Ahora, en nuestra actividad vamos a poner este código:

package me.parzibyte.ejemplolectorqr;

import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;

import com.blikoon.qrcodescanner.QrCodeActivity;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_QR_SCAN = 101;

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

    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, QrCodeActivity.class);
        startActivityForResult(i, REQUEST_CODE_QR_SCAN);
    }


}
  

REQUEST_CODE_QR_SCAN es un número único, ya que siempre podremos hacer peticiones, pero esas peticiones serán hechas con un número único para que cuando respondan podamos ver a cuál de todas están respondiendo. En este caso sólo haremos una, pero puede que luego agreguemos más.

En resumen, puedes cambiar el número. Luego vamos a escuchar cuando se responda nuestra solicitud, así:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode != Activity.RESULT_OK) {
            Toast.makeText(getApplicationContext(), "No se pudo obtener una respuesta", Toast.LENGTH_SHORT).show();
            String resultado = data.getStringExtra("com.blikoon.qrcodescanner.error_decoding_image");
            if (resultado != null) {
                Toast.makeText(getApplicationContext(), "No se pudo escanear el código QR", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        if (requestCode == REQUEST_CODE_QR_SCAN) {
            if (data != null) {
                String lectura = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult");
                Toast.makeText(getApplicationContext(), "Leído: " + lectura, Toast.LENGTH_SHORT).show();

            }
        }
    }

Básicamente vemos si pudimos leer, y también si el código QR era válido. En caso de que sí, mostramos un toast con lo que leímos. En caso de que no, pues avisamos.

Juntando todo, nuestra actividad se ve así:

package me.parzibyte.ejemplolectorqr;

import android.app.Activity;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

import com.blikoon.qrcodescanner.QrCodeActivity;

public class MainActivity extends AppCompatActivity {
    private static final int REQUEST_CODE_QR_SCAN = 101;

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

    public void onClick(View v) {
        Intent i = new Intent(MainActivity.this, QrCodeActivity.class);
        startActivityForResult(i, REQUEST_CODE_QR_SCAN);
    }

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (resultCode != Activity.RESULT_OK) {
            Toast.makeText(getApplicationContext(), "No se pudo obtener una respuesta", Toast.LENGTH_SHORT).show();
            String resultado = data.getStringExtra("com.blikoon.qrcodescanner.error_decoding_image");
            if (resultado != null) {
                Toast.makeText(getApplicationContext(), "No se pudo escanear el código QR", Toast.LENGTH_SHORT).show();
            }
            return;
        }
        if (requestCode == REQUEST_CODE_QR_SCAN) {
            if (data != null) {
                String lectura = data.getStringExtra("com.blikoon.qrcodescanner.got_qr_scan_relult");
                Toast.makeText(getApplicationContext(), "Leído: " + lectura, Toast.LENGTH_SHORT).show();

            }
        }
    }
}

Con ello podemos ejecutar nuestra app y ver qué pasa…

Probando app

Al abrir la app se ve esto:

Ventana principal de aplicación para leer códigos QR en Android

Generé un código en mi computadora utilizando AngularJS (sólo para probar rápidamente, pero podemos leer un código QR impreso, de cualquier página web, etcétera) así:

Si quieres entrar y generar uno, haz click aquí.

Luego abrí el lector, se ve así:

Escaneando código QR desde Android

Y finalmente, al leer, se mostró el toast:

Código QR leído correctamente

Internacionalización, idiomas o traducción

No hace falta que lo digan; yo también noté que algunas o todas las etiquetas están en inglés. Pues bien, hay una forma de “traducir” esto aunque me parece que no es un método permanente.

Se trata de un archivo que se queda en la caché. Podemos buscarlo en Android Studio con Ctrl + Shift + N, escribiendo “values.xml” y eligiendo editar el que pertenece al lector QR. Es el siguiente:

Ahí vamos a encontrar muchos valores y también colores. Podemos traducir algunos. En mi caso cambié  “Scan” por “Escanear” y “Picture” por “Elegir imagen“:

Y la app se ve así (notar que en la parte superior tiene los valores que cambié):

Pero infiero que, como dice caché, se borrará en la siguiente sincronización. Para ello podemos tener un archivo aparte que guardará los valores, o algo que se nos ocurra.

Conclusión

Lo único que tengo que decir es que, si podemos, dejemos una estrella al repositorio en GitHub. Si quieres, descarga la aplicación desde aquí 🙂

 

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.
parzibyte

Programador freelancer listo para trabajar contigo. Aplicaciones web, móviles y de escritorio. PHP, Java, Go, Python, JavaScript, Kotlin y más :) https://parzibyte.me/blog/software-creado-por-parzibyte/

Ver comentarios

  • Buen dia, una pregunta tengo un proyecto para trabajar con lecturas de QR con un escaner, hasta el momento funciona perfectamente, pero... mi duda es, si se puede agregar un metodo como el siguiente, dentro de un fragmento en un Navigation Drawer?

    public void onClick(View v) {
    Intent i = new Intent(MainActivity.this, QrCodeActivity.class);
    startActivityForResult(i, REQUEST_CODE_QR_SCAN);
    }

    Actualmente tengo un boton para llamar un Activity desde un fragmento y dentro de ese activity un boton para iniciar el lector QR. O si conoces una forma de iniciar el escaner al llamar el Activity sin necesidad de presionar un boton.

    Agradeceria tus comentarios...

    • Yo iría por la opción de llamar a un fragment en el navigation drawer, y en el método onCreate llamar a la actividad del código QR, así se creará la sensación de que al tocar la opción del navigation drawer se escanea; pero en realidad estás haciendo esto: llamas a un fragment > En el fragment llamas a la actividad

  • Hola implemente el ejemplo, muy buen aporte, muchas gracias.Por otra parte encontre un pequeño detalle, al cargar la imagen desde la galeria se detiene la aplicación, sera que me puedas ayudar a corregir tal problema por favor.

    • Hola, todo depende del error que esté arrojando. Analiza el Logcat de Android Studio a ver qué sale, y si quieres lo pegas en un comentario. Antes de eso revisa si tienes permisos de leer el almacenamiento o de lo que sea que estés haciendo, porque en las últimas versiones de Android tienes que pedir permisos en tiempo de ejecución y todas esas cosas que seguramente ya sabrás.

    • Hola. Como puedes ver, la información está en la variable llamada lectura. Esa variable puedes guardarla en SQLite o en un archivo de texto, mandarla a un servidor o lo que desees según tus necesidades.
      Te invito a suscribirte a mi blog en la barra lateral derecha

Entradas recientes

Servidor HTTP en Android con Flutter

El día de hoy te mostraré cómo crear un servidor HTTP (servidor web) en Android…

3 días hace

Imprimir automáticamente todos los PDF de una carpeta

En este post te voy a enseñar a designar una carpeta para imprimir todos los…

4 días hace

Guía para imprimir en plugin versión 1 desde Android

En este artículo te voy a enseñar la guía para imprimir en una impresora térmica…

1 semana hace

Añadir tasa de cambio en sistema de información

Hoy te voy a mostrar un ejemplo de programación para agregar un módulo de tasa…

2 semanas hace

Comprobar validez de licencia de plugin ESC POS

Los usuarios del plugin para impresoras térmicas pueden contratar licencias, y en ocasiones me han…

2 semanas hace

Imprimir euro € en impresora térmica

Hoy voy a enseñarte cómo imprimir el € en una impresora térmica. Vamos a ver…

3 semanas hace

Esta web usa cookies.