iOS开发 - 系统自带框架实现扫一扫功能

iOS 扫一扫

利用系统自带框架实现扫一扫功能

一 项目配置

扫一扫功能相机和相册权限,在info.plist中设置询问用户是否允许访问的权限。

info.plist加入NSCameraUsageDescription、NSPhotoLibraryUsageDescription、NSPhotoLibraryAddUsageDescription

<key>NSCameraUsageDescription</key><string>开启相机权限,活动扫一扫更快捷</string><key>NSPhotoLibraryAddUsageDescription</key><string>添加照片需要您的同意</string><key>NSPhotoLibraryUsageDescription</key><string>开启照片权限,美照当然要人赞!</string>

二 扫一扫权限判断

当每次进入扫一扫页面时,需要判断是否开启了权限


/** 校验是否有相机权限 */
- (void)checkCameraAuthorizationStatus:(void(^)(BOOL granted))permissionGranted
{AVAuthorizationStatus videoAuthStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];switch (videoAuthStatus) {// 已授权case AVAuthorizationStatusAuthorized:{permissionGranted(YES);}break;// 未询问用户是否授权case AVAuthorizationStatusNotDetermined:{// 提示用户授权[AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {permissionGranted(granted);}];}break;// 用户拒绝授权或权限受限case AVAuthorizationStatusRestricted:case AVAuthorizationStatusDenied:{UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"请在”设置-隐私-相机”选项中,允许访问你的相机" message:nil delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];[alert show];permissionGranted(NO);}break;default:break;}
}

三 需要用到AVCaptureDevice、AVCaptureDeviceInput、AVCaptureMetadataOutput、AVCaptureSession、AVCaptureVideoPreviewLayer

  • AVCaptureDevice:捕获设备,通常是前置摄像头,后置摄像头,麦克风(音频输入)
  • AVCaptureDeviceInput:AVCaptureDeviceInput 代表输入设备,使用AVCaptureDevice 来初始化
  • AVCaptureMetadataOutput:输出
  • AVCaptureSession:session 把输入输出结合在一起,并开始启动捕获设备(摄像头)
  • AVCaptureVideoPreviewLayer:图像预览层,实时显示捕获的图像

设置相机


/**设置相机
*/
- (void)setupCamera {self.avDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];self.avInput = [AVCaptureDeviceInput deviceInputWithDevice:self.avDevice error:nil];self.avOutput = [[AVCaptureMetadataOutput alloc]init];[self.avOutput setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];self.avSession = [[AVCaptureSession alloc]init];[self.avSession setSessionPreset:AVCaptureSessionPresetHigh];if ([self.avSession canAddInput:self.avInput]){[self.avSession addInput:self.avInput];}if ([self.avSession canAddOutput:self.avOutput]){[self.avSession addOutput:self.avOutput];}// 二维码类型 AVMetadataObjectTypeQRCodeif ([self.avOutput.availableMetadataObjectTypes containsObject:AVMetadataObjectTypeQRCode]){self.avOutput.metadataObjectTypes = [NSArray arrayWithObject:AVMetadataObjectTypeQRCode];// AVMetadataObjectTypeAztecCode 条形码} else{return ;}[self.avSession startRunning];//开始扫描
}

返回预览layer

/**显示的预览layer@return AVCaptureVideoPreviewLayer*/
- (AVCaptureVideoPreviewLayer *)showPeviewLayer {self.avPreviewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.avSession];self.avPreviewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;return self.avPreviewLayer;
}

开始扫描与结束扫描

/**开始扫描*/
- (void)startRunning {[self.avSession startRunning];
}/**结束扫描*/
- (void)stopRunning {[self.avSession stopRunning];
}

输出扫描结果AVCaptureMetadataOutputObjectsDelegate


#pragma mark - AVCaptureMetadataOutputObjectsDelegate
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:
(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection
{if ([metadataObjects count] > 0){AVMetadataMachineReadableCodeObject * metadataObject = [metadataObjects objectAtIndex:0];NSString *result = metadataObject.stringValue;//扫描出来的字符串NSLog(@"result:%@",result);UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"显示扫描结果" message:result delegate:nil cancelButtonTitle:@"确定" otherButtonTitles:nil];[alert show];[self.avSession stopRunning];//停止扫描}
}

使用

	self.scanConfig = [[INQrScanConfig alloc] init];[self.scanConfig setupCamera];AVCaptureVideoPreviewLayer *previewLayer = [self.scanConfig showPeviewLayer];previewLayer.frame = self.layer.bounds;[self.layer insertSublayer:previewLayer atIndex:0];[self.scanConfig startRunning];

使用

//你要设置的矩形快的frame  为  x1, y1, w1, h1.//那么你的 rectOfInterest 应该设置为   (y1/h, x1/w, h1/h, w1/w)CGFloat size = 260.0;CGRect rect = CGRectMake((KAiSysScreenWidth - size)/2, (KAiSysScreenHeight - size)/2, size, size);// 使用 (y1/h, x1/w, h1/h, w1/w)self.avOutput.rectOfInterest = CGRectMake(rect.origin.y/KAiSysScreenHeight, rect.origin.x/KAiSysScreenWidth, size/KAiSysScreenHeight, size/KAiSysScreenWidth);

结果如图:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/20424.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

spring 详解二 IOC(Bean xml配置及DI)

配置列表 Xml配置 功能描述 <bean id"" class""></bean> Bean的id&#xff0c;配置id会转为Bean名称和不配就是全限定类名 <bean name"" ></bean> Bean的别名配置&#xff0c;存储在Factory的aliasMap中通过别名也…

操作系统Linux—day01

编程 网页 软件 网站项目 知识点&#xff1a; 前端页面&#xff1a;HTML css JavaScript JQuery VUE 数据库&#xff1a;Oracle MySQL 服务器&#xff1a;服务器的操作系统Linux Http://115.159.96.174:8090/EasyBuy/ www.baidu.com>http://180.101.49.12/ 后台技术…

几何伙伴行泊一体解决方案入选浦东人工智能十大创新技术

2023年7月8日&#xff0c;在全球瞩目的世界人工智能大会&#xff08;WAIC&#xff09;浦江东岸分会场&#xff0c;主题为“引领未来&#xff0c;赋能焕新”的“2023世界人工智能大会浦东论坛”隆重举办。浦东新区作为全国首个人工智能创新应用先导区&#xff0c;正打造上海人工…

electron的(maximize)最大化方法会导致头部白色横条以及四周大黑边

参考文章&#xff1a;https://www.w3cways.com/2505.html 感谢这位博主 我在使用win.maximize()后发现应用程序虽然最大化了&#xff0c;但是四周和顶部有一定宽度的黑边白边&#xff0c;在百度一段时间后没有发现其他人有这个问题 &#x1f614;唉 必现步骤&#xff1a; 只要…

前端理解的HTTP缓存(作用、缓存策略、缓存控制机制、应用)

一、HTTP缓存有什么作用&#xff1f; 缓存是为了重复使用而被存储的&#xff0c;可以减少浏览器和服务器之间通信的次数、降低网络延迟、加速页面加载、提高用户体验性等。不但能使网页打开速度更快&#xff0c;还能减少服务器的压力。 二、 浏览器的缓存策略有哪些&#xff1…

【MySQL】不就是事务

前言 嗨咯&#xff0c;小伙伴们大家好呀&#xff0c;我已经一个星期没有更新了&#xff0c;实在抱歉&#xff01;本期我们要学习MySQL初阶中的最后一课&#xff0c;MySQL数据库中的事务也算是近几年面试必考的问题&#xff0c;所以我们一定要认真学习。 目录 前言 目录 一、事…

派盘支持单向和双向资料同步

派盘作为一款本地云存储解决方案&#xff0c;不仅支持双向同步&#xff0c;还提供了设置部分文件夹单向同步的功能。这意味着用户可以根据自己的需求&#xff0c;精确控制文件夹的同步方向&#xff0c;以实现更有针对性的文件管理和同步。 π-Disk派盘 – 知识管理专家 派盘的…

最详细的下载安装PicGo图床配合Typora使用

1.node.js下载安装1.2 检验安装成功 2. PicGo下载安装3. 配置Gitee【配合PicGo使用】3.1 获取PicGo的token 4. 配置PicGo4.1 下载插件4.2 配置图床[Gitee]4.3 配置Typora 5. 上传图片到Gitee【重要】6.解决配置错误 1.node.js下载安装 【node.js下载链接】点击跳转页面&#x…

JVM (simple Version)

简介 JVM 其实就是一个Java进程 , 从操作系统申请一大块内存区域, 供 java 代码使用 . 申请出的内存 , 进一步划分 , 给出不同的用途 . JVM 内存区域划分 : 堆中存放就是 new 出来的对象. (成员变量) 栈 是用来维护方法之间的调用关系 (局部变量) 元数据区(或者叫方法区) 存放的…

day34-servlet 分页

0目录 servlet 1.分页 分页逻辑1&#xff1a;数据库中20条记录&#xff0c;要求每页5条数据&#xff0c;则一共有4页 分页逻辑2&#xff1a;数据库中21条记录&#xff0c;要求每页5条数据&#xff0c;则一共有5页 分页逻辑3&#xff1a;数据库中19条记录&#xff0c;要求每页…

Java阶段五Day04

Java阶段五Day04 文章目录 Java阶段五Day04订单交易案例调整项目案例环境克隆项目验证maven环境数据库导入本地mysql核心业务 实现csmall-for-jsd-all纵向拆分csmall-for-jsd-order系统 删除module&#xff08;删除maven项目&#xff09;idea记录maven忽略pull远程解决冲突git对…

Windows操纵kafka

这里写目录标题 启动kafk创建一个测试主题查看所有主题查看first详细信息修改分区数(分区数只能增加 不能减少)删除主题生产者生产数据消费命令 启动kafk 安装目录下 .\bin\windows\kafka-server-start.bat .\config\server.properties创建一个测试主题 安装目录下 .\bin\wi…