zoukankan      html  css  js  c++  java
  • iOS扫描二维码(系统方法)

     步骤如下:

     1.导入AVFoundation框架,引入<AVFoundation/AVFoundation.h>

     2.设置一个用于显示扫描的view

     3.实例化AVCaptureSessionAVCaptureVideoPreviewLayer

     

    @property (weak, nonatomic) IBOutlet UIView *viewPreView;
    //捕捉会话
    @property (nonatomic, strong) AVCaptureSession *captureSession;
    //展示layer
    @property (nonatomic, strong) AVCaptureVideoPreviewLayer *videoPreviewLayer;
    
     _captureSession = nil;
      [self startReading];
    

    开始扫描

    - (BOOL)startReading {
        NSError *error;
        
        //1.初始化捕捉设备(AVCaptureDevice),类型为AVMediaTypeVideo
        AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        
        //2.用captureDevice创建输入流
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
        if (!input) {
            NSLog(@"%@", [error localizedDescription]);
            return NO;
        }
        
        //3.创建媒体数据输出流
        AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
        
        //4.实例化捕捉会话
        _captureSession = [[AVCaptureSession alloc] init];
        
        //4.1.将输入流添加到会话
        [_captureSession addInput:input];
        
        //4.2.将媒体输出流添加到会话中
        [_captureSession addOutput:captureMetadataOutput];
        
        //5.创建串行队列,并加媒体输出流添加到队列当中
        dispatch_queue_t dispatchQueue;
        dispatchQueue = dispatch_queue_create("myQueue", NULL);
        //5.1.设置代理
        [captureMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
        
        //5.2.设置输出媒体数据类型为QRCode
        [captureMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];
        
        //6.实例化预览图层
        _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
        
        //7.设置预览图层填充方式
        [_videoPreviewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
        
        //8.设置图层的frame
        [_videoPreviewLayer setFrame:_viewPreView.layer.bounds];
        
        //9.将图层添加到预览view的图层上
        [_viewPreView.layer addSublayer:_videoPreviewLayer];
        
        //10.设置扫描范围
        captureMetadataOutput.rectOfInterest = CGRectMake(0.2f, 0.2f, 0.8f, 0.8f);
        
        
        //11.开始扫描
        [_captureSession startRunning];
        
        
        return YES;
    }
    

    AVCaptureMetadataOutputObjectsDelegate

    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
    {
        NSString * stringValue;
        //判断是否有数据
        if (metadataObjects != nil && [metadataObjects count] > 0) {
            AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjects objectAtIndex:0];
            stringValue = metadataObj.stringValue;
        }
        NSLog(@"%@",stringValue);
        [_captureSession stopRunning];
    }
    

      

    来源: http://www.cnblogs.com/spaceID/p/4994443.html

      

  • 相关阅读:
    【SCOI 2011】 糖果
    【POJ 3159】 Candies
    【POJ 1716】 Integer Intervals
    【POJ 2983】 Is the information reliable?
    【POJ 1364】 King
    【POJ 1201】 Intervals
    【POJ 1804】 Brainman
    6月10日省中提高组题解
    【POJ 3352】 Road Construction
    【POJ 1144】 Network
  • 原文地址:https://www.cnblogs.com/spaceID/p/4994443.html
Copyright © 2011-2022 走看看