ios avfoundation ios7 qr-code avcapturesession

iOS 7 AVCaptureMetadataOutput delegate(QRCode scanner)



avfoundation ios7 (2)

Estoy tratando de resolver esto yo mismo. La documentación parece indicar que si no establece los tipos que desea en metadataObjectTypes, no recibirá ninguna llamada. Pero la cámara trasera de mi iPad Mini devuelve una matriz vacía de MetadataObjectTypes disponibles. Háganos saber lo que averigua.

Editar:

Acabo de descubrir que si agrega el objeto AVCaptureMetadataOutput a la sesión, los MetadataObjectTypes disponibles se completan y puede agregarle el detector de código de barras. A continuación, se llamará al delegado captureOutput, así que así:

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init]; [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; [session addOutput:output]; output.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];

Estoy tratando de implementar un escáner QRCode con las nuevas características de iOS 7, pero mi código no está llamando al método principal AVCaptureMetadataOutputObjectsDelegate .

He usado la cámara AVFoundation anteriormente y con mi implementación actual tengo la capa de vista previa ejecutándose sin problemas. Incluso cambiando mi salida a AVCaptureVideoDataOutput valida la configuración de mi sesión.

Estoy usando esta publicación de NSHipster como guía y aquí está mi código hasta ahora:

Interfaz:

@import AVFoundation; @interface QRCodeViewController () <AVCaptureMetadataOutputObjectsDelegate> @property (strong, nonatomic) AVCaptureDevice* device; @property (strong, nonatomic) AVCaptureDeviceInput* input; @property (strong, nonatomic) AVCaptureMetadataOutput* output; @property (strong, nonatomic) AVCaptureSession* session; @property (strong, nonatomic) AVCaptureVideoPreviewLayer* preview; @end

Preparar:

- (void)setupCamera { // Device self.device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; // Input self.input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil]; // Output self.output = [[AVCaptureMetadataOutput alloc] init]; [self.output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()]; // Session self.session = [[AVCaptureSession alloc] init]; [self.session addInput:self.input]; [self.session addOutput:self.output]; // Preview self.preview = [AVCaptureVideoPreviewLayer layerWithSession:self.session]; self.preview.videoGravity = AVLayerVideoGravityResizeAspectFill; self.preview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height); [self.view.layer insertSublayer:self.preview atIndex:0]; // Start [self.session startRunning]; }

Método de delegado:

// DELEGATE METHOD NOT CALLED - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection { NSLog(@"Metadata"); }

¡Cualquier ayuda es muy apreciada!


iOS 10 me causó el mismo problema. Actualmente tengo la edición de desarrollador lanzada en WWDC 2016. Cuando ejecuté la aplicación en un teléfono con iOS 9, se llamó nuevamente al método captureOutput:didOutputMetadataObjects: .