IOS 对于ios7扫描二维码功能的实现

在ios7以前,我们开发二维码扫描,或者生产都需要借助第三方的开源库进行开发。

然后升级到ios7时,在passbook中苹果自带二维码扫描功能,而且扫描速度非常快,秒杀一切第三方开源库。所以,我们做二维码的开发选用自带sdk优先级应该高于其他的库。


说到二维码的开发,我们需要用到这两个对象。如下。。

@property (nonatomic,strongAVCaptureSession *captureSession;

@property (nonatomic,strongAVCaptureVideoPreviewLayer *videoPreviewLayer;


CaptureSession 这是个捕获会话,也就是说你可以用这个对象从输入设备捕获数据流。

AVCaptureVideoPreviewLayer 可以通过输出设备展示被捕获的数据流。

首先我们应该判断当前设备是否有捕获数据流的设备。

AVCaptureDevice *captureDevice = [AVCaptureDevicedefaultDeviceWithMediaType:AVMediaTypeVideo];

    AVCaptureDeviceInput *input = [AVCaptureDeviceInputdeviceInputWithDevice:captureDevice error:&error];

   if (!input) {

        NSLog(@"%@", [errorlocalizedDescription]);

        return NO;

    }

如上,如果捕获到错误,直接返回。
初始化一个CaptureSession对象


    _captureSession = [[AVCaptureSessionalloc] init];

设置会话的输入设备

    [_captureSession addInput:input];



对应输出


    AVCaptureMetadataOutput *captureMetadataOutput = [[AVCaptureMetadataOutputalloc] init];

    [_captureSession addOutput:captureMetadataOutput];


创建一个队列

    dispatch_queue_t dispatchQueue;

    dispatchQueue = dispatch_queue_create("myQueue",NULL);

    [captureMetadataOutput setMetadataObjectsDelegate:selfqueue:dispatchQueue];

    [captureMetadataOutput setMetadataObjectTypes:[NSArrayarrayWithObject:AVMetadataObjectTypeQRCode]];


 降捕获的数据流展现出来

    _videoPreviewLayer = [[AVCaptureVideoPreviewLayeralloc] initWithSession:_captureSession];

    [_videoPreviewLayersetVideoGravity:AVLayerVideoGravityResizeAspectFill];

    [_videoPreviewLayer setFrame:_viewPreview.layer.bounds];

    [_viewPreview.layeraddSublayer:_videoPreviewLayer];

开始捕获
    [_captureSession startRunning];




获得的数据在

AVCaptureMetadataOutputObjectsDelegate 唯一定义的方法中

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


判断是否有数据,是否是二维码数据

    if (metadataObjects != nil && [metadataObjects count] > 0) {

        AVMetadataMachineReadableCodeObject *metadataObj = [metadataObjectsobjectAtIndex:0];

        if ([[metadataObjtype] isEqualToString:AVMetadataObjectTypeQRCode]) {


//获得扫描的数据,并结束扫描

            [selfperformSelectorOnMainThread:@selector(stopReading:)withObject:metadataObj.stringValuewaitUntilDone:NO];


}

}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值