Seleccionar página

En el siguiente post, vamos a crear un lector de códigos QR en Objective-c utilizando una librería de Apple, llamada AVFoundation. Ya que desde las últimas versiones de IOS ya no es necesario utilizar librerías externas.

Para empezar crearemos un nuevo proyecto y seleccionaremos “Empty Application”. Le asignamos un nombre, en nuestro caso “LectorQR”.

Lector QR para iPhone/iPad/iPod

Se crea el “UIViewController” principal con el que controlaremos la cámara y el decodificado. Simplemente hemos de crear una nueva clase que extienda de UIViewController.

Lector QR para iPhone/iPad/iPod

Continuamos creando el “Storyboard”  que nos permitirá controlar la parte gráfica de nuestra aplicación. Para ello, vamos a File -> new -> File. Seleccionamos “User Interface” y luego “StoryBoard”. A continuación se selecciona el dispositivo para el que se va a crear la interfaz, en este caso “iPhone”.

Lector QR para iPhone/iPad/iPod

Una vez creado, se añade un “View Controller” y se le asigna la clase que hemos creado anteriormente.

Lector QR para iPhone/iPad/iPod

Hemos de fijar el “StoryBoard” como vista principal.

Lector QR para iPhone/iPad/iPod

Importamos AVFoundation

 

#import <AVFoundation/AVFoundation.h>

 

Es un framework que facilita la creación, edición, visualización y captura de la cámara de nuestro dispositivo.

Para poder realizar la captura, es necesario utilizar la clases “AVCaptureSession” . Se crea la sesión en el método “viewDidLoad” de nuestro viewController.

 

AVCaptureSession *session = [[AVCaptureSessionalloc] init];

 

Es necesario añadir la cámara principal a la sesión. Primero se obtiene la entrada de vídeo por defecto, que será la cámara trasera en dispositivos con múltiples cámaras. Luego se crea el objeto para usar el dispositivo “AVCaptureDeviceInput”, para luego añadirlo a la sesión:

 

// Se crea AVCaptureDevice como tipo Video

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType: AVMediaTypeVideo];

NSError *error = nil;

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice: device error:&error];

if(input) {

// Añadir input a la sesión

[session addInput:input];

} else {

        NSLog(@”error: %@”, error);

return ;

}

 

Para poder añadir el video a la pantalla es necesario crear un objeto “AVCaptureVideoPreviewLayer”, que  es una subclase de CALayer. Cuando se le añade la sesión mostrará el video de la cámara:

 

_previewLayer = [AVCaptureVideoPreviewLayerlayerWithSession: session];

    _previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

    _previewLayer.bounds = self.view.bounds;

    _previewLayer.position = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds));

    [self.view.layeraddSublayer:_previewLayer];

 

La propiedad videoGravity permite especificar cómo debe de aparecer el video en los límites de la capa. Dado que la relación de aspecto del video no es igual a la de la pantalla, hemos de cortar los bordes para llenar toda la pantalla,  por lo que utilizaremos “AVLayerVideoGravityResizeAspectFill”. Y añadimos la capa a la vista principal.

Para iniciar la captura de video, iniciamos la sesión. Si ejecutamos la aplicación podremos ver la cámara en la pantalla.

 

[session startRunning];

Lector QR para iPhone/iPad/iPod

Capturando datos:

A continuación, es necesario obtener los datos para extraer el código QR. Para ello utilizamos AVCaptureMetadataOutput que es una clase de AVCAptureOutput que detecta metadatos en video y los procesa. Para ello necesitamos el siguiente código:

 

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutputalloc] init];

// Se añade la captura de metadatos

[session addOutput:output];

// Mostramos los tipos de datos que se pueden obtener

NSLog(@”%@”, [output availableMetadataObjectTypes]);

 

Los metadatos son:

 

2014-02-13 11:27:03.352 LectorQR[12428:60b] (

    face,

    “org.gs1.UPC-E”,

    “org.iso.Code39”,

    “org.iso.Code39Mod43”,

    “org.gs1.EAN-13”,

    “org.gs1.EAN-8”,

    “com.intermec.Code93”,

    “org.iso.Code128”,

    “org.iso.PDF417”,

    “org.iso.QRCode”,

    “org.iso.Aztec”

)

Se registra los metadatos que se quieren leer y se fija la clase como delegada para poder recibir los datos.

 

// Se selecciona los metadatos que se quieren obtener

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

// Se fija el la clase como Delegate

[outputsetMetadataObjectsDelegate: selfqueue:dispatch_get_main_queue()];

 

Se fija la clase como delegada

 

@interface CapturaViewController : UIViewController <AVCaptureMetadataOutputObjectsDelegate>{

 AVCaptureVideoPreviewLayer *_previewLayer;

}

 

La clase ha de implementar el objeto receptor de metadatos:

captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection

 

Se implenta el método que transforma los metadatos y se impreme el valor del QR:

 

#pragma mark – AVCaptureMetadataOutputObjectsDelegate

– (void)captureOutput: (AVCaptureOutput *)captureOutput

didOutputMetadataObjects: (NSArray *)metadataObjects

fromConnection: (AVCaptureConnection *)connection

{

    for (AVMetadataObject *metadata in metadataObjects) {

        if ([metadata.typeisEqualToString: AVMetadataObjectTypeQRCode]) {

            // Se transforman los metadatos

   AVMetadataMachineReadableCodeObject *transformed =

(AVMetadataMachineReadableCodeObject *)[_previewLayer transformedMetadataObjectForMetadataObject: metadata];

            // Mostrar código

            NSLog(@”%@”, [transformed stringValue]);

}

    }

}

Lector QR para iPhone/iPad/iPod

Podeis encontrar el código completo pulsando Aquí

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.

ACEPTAR
Aviso de cookies