美文网首页
iOS扫描二维码

iOS扫描二维码

作者: C_JH | 来源:发表于2018-08-29 19:17 被阅读27次

    引用#import <AVFoundation/AVFoundation.h>系统库

    判断权限

    //判断权限
        [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
            dispatch_async(dispatch_get_main_queue(), ^{
                if (granted) {
                    [self loadScanView];
                } else {
                    NSString *title = @"请在iPhone的”设置-隐私-相机“选项中,允许App访问你的相机";
                    UIAlertController *ctrl = [UIAlertController alertControllerWithTitle:title message:nil preferredStyle:UIAlertControllerStyleAlert];
                    UIAlertAction *action = [UIAlertAction actionWithTitle:@"好" style:UIAlertActionStyleDefault handler:nil];
                    [ctrl addAction:action];
                }
            });
        }];
    

    初始化各对象

    @property (nonatomic, strong) AVCaptureSession *session;
    
    - (void)loadScanView {
        //获取摄像设备
        AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
        //创建输入流
        AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
        //创建输出流
        AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc]init];
        //设置代理 在主线程里刷新
        [output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
        //初始化链接对象
        self.session = [[AVCaptureSession alloc]init];
        //高质量采集率
        [self.session setSessionPreset:AVCaptureSessionPresetHigh];
        
        //添加输入输出
        [self.session addInput:input];
        [self.session addOutput:output];
        //设置扫码支持的编码格式NSArray<AVMetadataObjectType>*
        output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode];
    
        //设置相机的取景器
        AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];
        //相机内容显示模式
        layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
        layer.frame = self.view.layer.bounds;
        [self.view.layer insertSublayer:layer atIndex:0];
        
        //启用session
        [self.session startRunning];
    }
    

    扫描结果

    - (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
        [self.session stopRunning];//停止会话
        [self.preview removeFromSuperlayer];//移除取景器
        
        if (metadataObjects.count > 0) {
            AVMetadataMachineReadableCodeObject *obj = metadataObjects[0];
            //扫描结果
            NSString *result = obj.stringValue;
            //后续处理...
        }
    }
    

    开启/关闭闪光灯

    if (_isOnlight) { //打开闪光灯
            AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
            NSError *error = nil;
            if ([captureDevice hasTorch]) {
                BOOL locked = [captureDevice lockForConfiguration:&error];
                if (locked) {
                    captureDevice.torchMode = AVCaptureTorchModeOn;
                    [captureDevice unlockForConfiguration];
                }
            }
        }else{//关闭闪光灯
            AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
            if ([captureDevice hasTorch]) {
                [captureDevice lockForConfiguration:nil];
                [captureDevice setTorchMode: AVCaptureTorchModeOff];
                [captureDevice unlockForConfiguration];
            }
        }
    

    相关文章

      网友评论

          本文标题:iOS扫描二维码

          本文链接:https://www.haomeiwen.com/subject/qtahwftx.html