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 *

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?