导入#import <AVFoundation/AVFoundation.h>
遵守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;
//懒加载device。默认调用后置摄像头
-(AVCaptureDevice *)device{
NSArray *Devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
for (AVCaptureDevice *Device in Devices)
{
//设置为前置摄像头,也可为后置
if ([Device position] == AVCaptureDevicePositionFront )
{
return Device;
}
}
return nil;
}
ViewDidLoad中设置相机:
// Input
_input = [AVCaptureDeviceInput deviceInputWithDevice:self.device error:nil];
// Output
_output = [[AVCaptureMetadataOutput alloc]init];
[_output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
// Session
_session = [[AVCaptureSession alloc]init];
[_session setSessionPreset:AVCaptureSessionPresetHigh];
if ([_session canAddInput:self.input])
{
[_session addInput:self.input];
}
if ([_session canAddOutput:self.output])
{
[_session addOutput:self.output];
}
// 条码类型 AVMetadataObjectTypeQRCode
// iOS8 下需要使用新的 API
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:AVMetadataObjectTypeQRCode, AVMetadataObjectTypeUPCECode, AVMetadataObjectTypeCode39Code, AVMetadataObjectTypeCode39Mod43Code, AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode93Code, AVMetadataObjectTypeCode128Code, AVMetadataObjectTypePDF417Code, AVMetadataObjectTypeAztecCode, nil];
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 8.0){
[array addObject:AVMetadataObjectTypeInterleaved2of5Code];
[array addObject:AVMetadataObjectTypeITF14Code];
[array addObject:AVMetadataObjectTypeDataMatrixCode];
}
//必须加上判断系统是否支持,否则会出错
if ([self.output.availableMetadataObjectTypes containsObject:array]) {
_output.metadataObjectTypes = array;
}
// Preview
_preview =[AVCaptureVideoPreviewLayer layerWithSession:self.session];
_preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
_preview.frame = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width , [UIScreen mainScreen].bounds.size.height); /// 220 *220
//_preview.frame = CGRectMake([UIScreen mainScreen].bounds.size.width/2-110, [UIScreen mainScreen].bounds.size.height/2-110, 220, 220);
[self.view.layer insertSublayer:self.preview atIndex:0];
// Start
[_session startRunning];
#pragma mark AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{
NSString *stringValue = @"";
if ([metadataObjects count] > 0)
{
AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];
stringValue = metadataObject.stringValue;
}
// 发起网络请求
// if (![NSString MyStringIsNULL:stringValue]) {
// [_session stopRunning];
// [self netWithStr:stringValue];
// }
}