利用AVFoundation扫描二维码、条形码

利用iOS系统自带的AVFoundation扫描二维码、条形码,效率很高还省去了导入第三方库的麻烦。使用流程大概如下:

- (BOOL)startReading {
    if (!_captureSession) {
        // 获取 AVCaptureDevice 实例
        NSError * error;
        AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        // 初始化输入流
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
        if (!input) {
            JCLog(@"%@", [error localizedDescription]);
            return NO;
        }
        // 创建会话
        _captureSession = [[AVCaptureSession alloc] init];
        // 添加输入流
        [_captureSession addInput:input];
        // 初始化输出流
        AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
        // 添加输出流
        [_captureSession addOutput:captureMetadataOutput];
        // 创建dispatch queue.
        dispatch_queue_t dispatchQueue;
        dispatchQueue = dispatch_queue_create([kScanQRCodeQueueName UTF8String], NULL);
        [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
        // 设置元数据类型 AVMetadataObjectTypeQRCode
        [captureMetadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode,
                                                        AVMetadataObjectTypeUPCECode,
                                                        AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode39Mod43Code,AVMetadataObjectTypeEAN13Code,
                                                        AVMetadataObjectTypeEAN8Code,
                                                        AVMetadataObjectTypeCode93Code,
                                                        AVMetadataObjectTypeCode128Code,
                                                        AVMetadataObjectTypePDF417Code,
                                                        AVMetadataObjectTypeAztecCode,
                                                        AVMetadataObjectTypeInterleaved2of5Code,
                                                        AVM 大专栏  利用AVFoundation扫描二维码、条形码etadataObjectTypeITF14Code,
                                                        AVMetadataObjectTypeDataMatrixCode,]];
    }

    if (!_videoPreviewLayer) {
        // 创建输出对象
        _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
        [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        [_videoPreviewLayer setFrame:_scanView.layer.bounds];
        [_scanView.layer insertSublayer:_videoPreviewLayer atIndex:0];
    }

    // 开始会话
    [_captureSession startRunning];
    [self startScanAnimation];
    return YES;
}

- (void)stopReading {
    [self stopScanAnimation];
    // 停止会话
    [_captureSession stopRunning];
}

- (void)reportScanResult:(NSString *)result {
    if (!result.length) {
        return;
    }
    [self stopReading];
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"设备号" message:result preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) {
        [self startReading];
    }]];
    [alert addAction:[UIAlertAction actionWithTitle:@"绑定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        [self requestBindDeviceWithImei:result];
    }]];
    [self presentViewController:alert animated:YES completion:nil];
}

#pragma AVCaptureMetadataOutputObjectsDelegate
-(void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects
      fromConnection:(AVCaptureConnection *)connection {
    if (metadataObjects != nil && [metadataObjects count] > 0) {
        AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
        NSString *result;
        if ([[metadataObj type] isEqualToString:AVMetadataObjectTypeQRCode]) {
            result = metadataObj.stringValue;
        } else {
            NSLog(@"不是二维码");
            result = metadataObj.stringValue;
        }
        [self performSelectorOnMainThread:@selector(reportScanResult:) withObject:result waitUntilDone:NO];
    }
}

猜你喜欢

转载自www.cnblogs.com/wangziqiang123/p/11696413.html