IOS开发 扫描二维码

来源:互联网 发布:telnet使用什么端口 编辑:程序博客网 时间:2024/05/17 13:09

//加入头文件

#import <AVFoundation/AVFoundation.h>

//代理

AVCaptureMetadataOutputObjectsDelegate


@property (nonatomic,strong)AVCaptureSession *session;//输入输出的中间桥梁

//设置AVCaptureMetadataOutput rectOfInterest的属性就可以了  这样设置就可以:CGRectMakey的起点/屏幕的高,x的起点/屏幕的宽,扫描的区域的高/屏幕的高,扫描的区域的宽/屏幕的宽)

@property (nonatomic,strong)AVCaptureMetadataOutput *output;//设置全屏显示,但是实际扫描区域只在一个框内


//判断是否有相机的访问权限

if(authStatus == AVAuthorizationStatusRestricted || authStatus == AVAuthorizationStatusDenied){

            

            UIAlertView *alertView = [[UIAlertViewalloc]initWithTitle:nilmessage:@"现在无法访问您的相机,请前往\"设置\"-\"隐私\"-\"相机\"选项中,允许住逻辑访问您的相机"delegate:selfcancelButtonTitle:@"取消"otherButtonTitles:@"去授权",nil];

            

            [alertView show];

//            NSLog(@"相机权限受限");

        }else{

            //成功后调用方法

            [self createSTQCode];

        }


// 封装的方法

-(void)createSTQCode{

   

    //判断报的是什么错获取系统的错误信息

//    NSError *error;

    //获取摄像设备

    AVCaptureDevice *device = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];

    //创建输入流

    AVCaptureDeviceInput *input = [AVCaptureDeviceInputdeviceInputWithDevice:deviceerror:nil];

    //创建输出流

    _output = [[AVCaptureMetadataOutputalloc]init];

    

    //设置代理在主线程里刷新

    [_outputsetMetadataObjectsDelegate:selfqueue:dispatch_get_main_queue()];

    

    //初始化连接对象

    self.session = [[AVCaptureSessionalloc]init];

    //高质量采集率

    [self.sessionsetSessionPreset:AVCaptureSessionPresetHigh];

    [self.sessionaddInput:input];

    [self.sessionaddOutput:_output];

    

    // 指明 扫描的是条形码还是二维码必须放在 [self.session addOutput:output];后面 不然会崩

    [_outputsetMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];//二维码

    

//    //设置扫码支持的编码格式(如下设置条形码和二维码兼容)

//    output.metadataObjectTypes=@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code];


    AVCaptureVideoPreviewLayer *layer = [AVCaptureVideoPreviewLayerlayerWithSession:self.session];

    layer.videoGravity =AVLayerVideoGravityResizeAspectFill;

    layer.frame =self.layer.bounds;

    [self.layerinsertSublayer:layeratIndex:0];

    //开始捕获

    [self.sessionstartRunning];

}







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

    if (metadataObjects.count >0) {

        

AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjectsobjectAtIndex :0 ];

        

        NSString *str = metadataObject.stringValue;

//str 就是扫描的数据

  NSLog(@"%@",str);

    }else

    {

        NSLog(@"没有扫描到数据");

    }

}



- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex

{

    

    if (buttonIndex == 1 && [UIDevice currentDevice].systemVersion.floatValue >=8.0) {

//没有相机权限的时候 直接跳转到设置界面

        [[UIApplicationsharedApplication]openURL:[NSURLURLWithString:UIApplicationOpenSettingsURLString]];

    }

    

}



0 0
原创粉丝点击