在ios7以后,AVFoundation支持多种条形码的识别,AztecCode,QRCode,UPCECode,EAN8Code,EAN13Code,Code39Code,Code93Code,Code128Code,Interleaved2of5Code,ITF14Code。现在应用中比较常见的是QRCode。
![](https://img.haomeiwen.com/i1502501/159998618c1002ec.png)
原理同人脸识别是一样的,将我们要识别的类型添加到捕捉输出中,在设备识别出后会调用相应的代理方法。具体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];
}
}
}
网友评论