Creamos un proyecto vacío en android y le añadimos la librería “core.jar”. La puedes encontrar descargandote el proyecto de github
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>
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
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);
Podeis encontrar el proyecto completo pulsando Aquí
0 comentarios