我在两个项目中分别使用了ZBarSDK与系统自带的扫码,今天主要介绍一下系统自带的扫码。

1。系统自带的

(1)先声明两个属性

@property (nonatomic,strong)AVCaptureSession *session; //捕捉会话

@property (nonatomic,strong)AVCaptureVideoPreviewLayer *layer; //扫描图层

(2)添加输入设备并检查设备是否支持相机

//添加输入设备并创建捕捉会话

AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];

self.session = [[AVCaptureSession alloc] init];

AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];

NSError *error=nil;

if (input) {

[self.session addInput:input];

}else{

NSLog(@"获取摄像设备error:%@",[error localizedDescription]);

}

//检查相机状态

AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];

if(status == AVAuthorizationStatusAuthorized) {

[self setupCamera];

} else {

[self showStr:@"您没有权限访问相机" withSelf:self withMinier:2.0];

}

(3)在能打开相机的情况下创扫描图层

//添加输出数据

AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];

[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];

//高质量采集率

[self.session setSessionPreset:AVCaptureSessionPresetHigh];

[self.session addOutput:output];

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

[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode,AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code, AVMetadataObjectTypeCode128Code]];

//添加扫描图层

self.layer = [AVCaptureVideoPreviewLayer layerWithSession:self.session];

self.layer.frame = CGRectMake((ScreenWidth-250)/2,ScreenHeight*0.25, 250, 250);

self.layer.videoGravity = AVLayerVideoGravityResizeAspectFill;

[self.view.layer addSublayer:self.layer];

(4)开始扫描

[self.session startRunning];

(5)如果扫描到数据会调用代理方法 (遵守AVCaptureMetadataOutputObjectsDelegate协议)

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

   注意:xcode8的 用户在使用这个功能的时候要先再plist。info 中添加项: Privacy - Camera Usage Description     是否允许此App使用你的相机?

2.ZBarSDK

    参考自:http://www.mincoder.com/article/4419.shtml

最新文章

  1. C#设计模式系列:状态模式(State)
  2. C#并行编程-Parallel
  3. 如何破解Excel文档的编辑密码
  4. python时间模块-time和datetime
  5. linux 安装eclipse 和cdt
  6. 史无前例的Firefox奇怪问题:host中的common名称造成css文件无法加载
  7. 【转载】gcc 使用中常用的参数及命令
  8. android开发中提示:requires permission android.permission write_settings解决方法
  9. .net对文件的操作之文件读写
  10. Hadoop 2、配置HDFS HA (高可用)
  11. 工作流设计参考(包括PHP实现)
  12. day4 liaoxuefeng--调试、线程、正则表达式
  13. Java练习2
  14. Mysql 获取表设计查询语句
  15. js ++i和i++的区别
  16. CSS初步学习
  17. Win10系列:C#应用控件基础8
  18. double转换为二进制
  19. hdu 2546 饭卡【01背包】
  20. python自定义安装包

热门文章

  1. .net 分布式架构之分布式缓存中间件
  2. Angular2开发笔记
  3. js报错: Uncaught RangeError: Invalid string length
  4. jQuery的属性
  5. 多线程 异步 beginInvoke EndInvoke 使用
  6. Atitit.软件研发团队建设原理与概论 理论
  7. 在redis中使用lua脚本让你的灵活性提高5个逼格
  8. Struts框架的核心业务
  9. 第14章 Linux启动管理(2)_启动引导程序grub
  10. 【原】npm 常用命令详解