Lector QR – Android

Feb 21, 2014 | Android | 0 Comentarios

Utilizar la librería “zxing” de Google que la podéis encontrar en el siguiente enlace: https://github.com/zxing/zxing. La librería pertecene a Google. Para poder utilizarla es necesario descargarse los archivos y compilarlos en eclipse. Para facilitar el desarrollo, vamos a suministrar la librería ya compilada, la podeis encontrar en el siguiente enlace.

Creamos un proyecto vacío en android y le añadimos la librería “core.jar”. La puedes encontrar descargandote el proyecto de github

Lector QR - Android

Añadimos una surfaceView al activity principal para cargar la cámara. En nuestro caso la cargamos a pantalla completa. El código xml es el siguiente:

 

<RelativeLayout xmlns:android=«http://schemas.android.com/apk/res/android»

xmlns:tools=«http://schemas.android.com/tools»

android:layout_width=«match_parent»

android:layout_height=«match_parent»

tools:context=«.QrActivity» >

<SurfaceView

android:id=«@+id/sVCamara»

android:layout_width=«match_parent»

android:layout_height=«match_parent»

android:layout_alignParentLeft=«true»

android:layout_alignParentTop=«true» />

</RelativeLayout>

Lector QR - Android

Creamos la variable que contiene el SurfaceView y lo obtenemos del xml.

 

private SurfaceView surfaceView;

 

this.surfaceView = (SurfaceView) findViewById(R.id.sVCamara);

 

Para poder manejar el objeto Surface es necesario crear un objeto contenedor SurfaceHolder, ya que no se puede manejar directamente. Para ello se utiliza el constructor de la clase getHolder() e indicar que SurfaceHolder va a recibir llamadas de SurfaceHolder.callback.

 

private SurfaceHolder surfaceHolder;

this.surfaceHolder = this.surfaceView.getHolder();

this.surfaceHolder.addCallback(this);

this.surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

Indicamos que el activity principal va a recibir las llamadas. Para ello el activity ha de implementar “SurfaceHolder.Callback” e implementar los siguientes métodos:

@Override

publicvoid surfaceChanged(SurfaceHolder holder, int format, int width,

int height) {

}

@Override

publicvoid surfaceCreated(SurfaceHolder holder) {

}

@Override

publicvoid surfaceDestroyed(SurfaceHolder holder) {

}

Para poder gestionar la cámara es necesario crear un objeto “Camera”:

private Camera camara;

Para poder utilizar la camara es necesario dar permiso en el AndroidManifest.xml

<uses-permission android:name=«android.permission.CAMERA» />

A continuación vamos a implementar los métodos de surfaceHolder.

1.- surfaceCreated:

Abrimos la cámara

this.camara = Camera.open();

2.- surfaceChanged:

Se inicia la camara

if (this.surfaceView.getHolder() == null){

return;

}

try {

this.camara.stopPreview();

catch (Exception e){

}

if (this.camara != null){

try {

this.camara.setDisplayOrientation(90);

this.camara.setPreviewDisplay(this.surfaceHolder);

this.camara.startPreview();

catch (Exception e){}

}

3.- surfaceDestroyed:

Se para la camara.

this.camara.stopPreview();

this.camara.setPreviewCallback(null);

this.camara.release();

this.camara = null;

this.previewing = false;

 

si ejecutamos la aplicación ya se puede ver la cámara del dispositivo

Lector QR - Android

Implementamos un auto-enfoque, para lo cuál necesitamos un handler

private Handler autoFocusHandler;

 

autoFocusHandler = new Handler();

 

private Runnable doAutoFocus = new Runnable() {

publicvoid run() {

camara.autoFocus(autoFocusCB);

}

};

AutoFocusCallback autoFocusCB = new AutoFocusCallback() {

publi cvoid onAutoFocus(boolean success, Camera camera) {

autoFocusHandler.postDelayed(doAutoFocus, 1000);

}

};

Se añade a la cámara en el método surface change después de iniciar la previsualización:

this.camara.startPreview();

this.camara.autoFocus(autoFocusCB);

Ahora es necesario crear un método para procesar los datos que se obtienen de la cámara

PreviewCallback previewBarCode = new PreviewCallback(){

publicvoid onPreviewFrame(byte[] data, Camera camera) {

Size previewSize = camera.getParameters().getPreviewSize();

YuvImage yuvimage=new YuvImage(data, ImageFormat.NV21, previewSize.width, previewSize.height,null);

ByteArrayOutputStream baos = new ByteArrayOutputStream();

yuvimage.compressToJpeg(new Rect(0, 0, previewSize.width, previewSize.height), 80, baos);

byte[] jdata = baos.toByteArray();

// Convert to Bitmap

Bitmap bitmap = BitmapFactory.decodeByteArray(jdata, 0, jdata.length);

if (bitmap != null){

int width = bitmap.getWidth(), height = bitmap.getHeight();

int[] pixels = newint[width * height];

bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

bitmap.recycle();

bitmap = null;

RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);

BinaryBitmap bBitmap = new BinaryBitmap(new HybridBinarizer(source));

MultiFormatReader reader = new MultiFormatReader();

try

{

Result result = reader.decode(bBitmap);

Log.v(«Comprobar qr», result.getText());

}

catch (NotFoundException e){}

}else{

}

}

};

Se añade el método para procesar QR

this.camara.setDisplayOrientation(90);

this.camara.setPreviewCallback(previewBarCode);

Lector QR - Android

Podeis encontrar el proyecto completo pulsando Aquí

0 comentarios

Enviar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *


El periodo de verificación de reCAPTCHA ha caducado. Por favor, recarga la página.

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

.Estás en el punto de partida?

Contacta con nosotros y cuéntanos tu proyecto.

Mapa de ubicación dentro de la sección método App&Web
Estamos en:

C/ Gracia, 12 1ª Planta Granada (18004) Granada

623 02 64 34

 contacto@appandweb.es

Follows
Shares
Share This
¿Necesitas ayuda?