ios 使用原生AVFoundation扫描二维码

在ios7以后,AVFoundation支持多种条形码的识别,AztecCode,QRCode,UPCECode,EAN8Code,EAN13Code,Code39Code,Code93Code,Code128Code,Interleaved2of5Code,ITF14Code。现在应用中比较常见的是QRCode。

QRCode

原理同人脸识别是一样的,将我们要识别的类型添加到捕捉输出中,在设备识别出后会调用相应的代理方法。具体demo可以查看YLQRCode.将二维码的生成和识别的方法封装成了一个工具类。

1.创建AVCaptureSession和捕捉预览AVCaptureVideoPreviewLayer

self.CaptureSession=[[AVCaptureSession alloc] init];

2.添加输入,输出(输出类型为AVCaptureMetadataOutput)。

(1)添加输入

self.device= [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

AVCaptureDeviceInput*videoInput = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];

if([self.CaptureSession canAddInput:videoInput]) {

[self.CaptureSession addInput:videoInput];

}

//判断用户是否授权访问摄像头

AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

if(status ==AVAuthorizationStatusAuthorized) {//授权则添加输出

[self addOutput];

}else if(status ==AVAuthorizationStatusDenied){//不同意就发出通知

[[NSNotificationCenter defaultCenter]postNotificationName:YLQRCodeAuthorizationDeniedNotification object:nil userInfo:nil];

}else{                                                                 //不确定,弹出通知,用户没有选择是否同意

[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {            //这个方法会在用户选择同意后执行block

if(granted ==YES) {

[self addOutput];

}

}];

}

(2)添加输出。

AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];

if([self.CaptureSession canAddOutput:metadataOutput]) {

[self.CaptureSession addOutput:metadataOutput];

if(self.device.autoFocusRangeRestrictionSupported) {

NSError*error;

[self.device lockForConfiguration:&error];

self.device.autoFocusRangeRestriction=AVCaptureAutoFocusRangeRestrictionNear;

[self.device unlockForConfiguration];

}

[metadataOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

metadataOutput.metadataObjectTypes= @[AVMetadataObjectTypeAztecCode,AVMetadataObjectTypeQRCode,AVMetadataObjectTypeUPCECode,AVMetadataObjectTypeEAN8Code,AVMetadataObjectTypeEAN13Code,AVMetadataObjectTypeCode39Code,AVMetadataObjectTypeCode93Code,AVMetadataObjectTypeCode128Code,AVMetadataObjectTypeInterleaved2of5Code,AVMetadataObjectTypeITF14Code];   //设置需要识别的类型。

}else{

NSLog(@"添加输出失败");

[[NSNotificationCenter defaultCenter]postNotificationName:YLQRCodeError object:nil];

}

3.代理回调。

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

if(metadataObjects.count> 0) {

AVMetadataMachineReadableCodeObject *codeObject = [metadataObjects firstObject];

if(self.handler) {

self.handler(codeObject.stringValue);

[self stopScan];

}

}

}

你可能感兴趣的:(ios 使用原生AVFoundation扫描二维码)