使用 IOS 自带 API 扫描二维码
2014-10-03 17:17
330 查看
第一步:加入框架 AVFoundation.framework
目录选择 targets -> Build Phases -> Link Binary with Libraries 后,加入AVFoundation.framework即可
第二步:加入以下代码,并加入协议 AVCaptureMetadataOutputObjectsDelegate,
定义全局变量
var session: AVCaptureSession?;
var previewLayer: AVCaptureVideoPreviewLayer?;
在需要使用的地方 使用readQRCode()函数即可
func readQRCode() {
//1.获取摄像头设备
var device:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo);
//2.设置输入
var error: NSError?;
var input: AVCaptureDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as AVCaptureDeviceInput;
if (error != nil) {
println("没有摄像头\(error?.localizedDescription)");
return;
}
// 3. 设置输出(Metadata元数据)
var output: AVCaptureMetadataOutput = AVCaptureMetadataOutput();
// 3.1 设置输出的代理
// 说明:使用主线程队列,相应比较同步,使用其他队列,相应不同步,容易让用户产生不好的体验
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue());
// 4. 拍摄会话
var session1: AVCaptureSession = AVCaptureSession();
session1.addInput(input);
session1.addOutput(output);
// 4.1 设置输出的格式
// 提示:一定要先设置会话的输出为output之后,再指定输出的元数据类型!
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode];
// 5. 设置预览图层(用来让用户能够看到扫描情况)
var preview: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session1) as AVCaptureVideoPreviewLayer;
// 5.1 设置preview图层的属性
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
// 5.2 设置preview图层的大小
preview.frame = self.view.bounds;
// 5.3 将图层添加到视图的图层
self.view.layer.insertSublayer(preview, atIndex: 0);
self.previewLayer = preview;
// 6. 启动会话
session1.startRunning();
self.session = session1;
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
// 会频繁的扫描,调用代理方法
// 1. 如果扫描完成,停止会话
self.session?.stopRunning();
// 2. 删除预览图层
self.previewLayer?.removeFromSuperlayer();
println(metadataObjects);
// 3. 设置界面显示扫描结果
if (metadataObjects.count > 0) {
var obj:AVMetadataMachineReadableCodeObject = metadataObjects[0] as AVMetadataMachineReadableCodeObject;
// 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!
println("结果如下:" + obj.stringValue);
}
}
目录选择 targets -> Build Phases -> Link Binary with Libraries 后,加入AVFoundation.framework即可
第二步:加入以下代码,并加入协议 AVCaptureMetadataOutputObjectsDelegate,
定义全局变量
var session: AVCaptureSession?;
var previewLayer: AVCaptureVideoPreviewLayer?;
在需要使用的地方 使用readQRCode()函数即可
func readQRCode() {
//1.获取摄像头设备
var device:AVCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo);
//2.设置输入
var error: NSError?;
var input: AVCaptureDeviceInput = AVCaptureDeviceInput.deviceInputWithDevice(device, error: &error) as AVCaptureDeviceInput;
if (error != nil) {
println("没有摄像头\(error?.localizedDescription)");
return;
}
// 3. 设置输出(Metadata元数据)
var output: AVCaptureMetadataOutput = AVCaptureMetadataOutput();
// 3.1 设置输出的代理
// 说明:使用主线程队列,相应比较同步,使用其他队列,相应不同步,容易让用户产生不好的体验
output.setMetadataObjectsDelegate(self, queue: dispatch_get_main_queue());
// 4. 拍摄会话
var session1: AVCaptureSession = AVCaptureSession();
session1.addInput(input);
session1.addOutput(output);
// 4.1 设置输出的格式
// 提示:一定要先设置会话的输出为output之后,再指定输出的元数据类型!
output.metadataObjectTypes = [AVMetadataObjectTypeQRCode];
// 5. 设置预览图层(用来让用户能够看到扫描情况)
var preview: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.layerWithSession(session1) as AVCaptureVideoPreviewLayer;
// 5.1 设置preview图层的属性
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
// 5.2 设置preview图层的大小
preview.frame = self.view.bounds;
// 5.3 将图层添加到视图的图层
self.view.layer.insertSublayer(preview, atIndex: 0);
self.previewLayer = preview;
// 6. 启动会话
session1.startRunning();
self.session = session1;
}
func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {
// 会频繁的扫描,调用代理方法
// 1. 如果扫描完成,停止会话
self.session?.stopRunning();
// 2. 删除预览图层
self.previewLayer?.removeFromSuperlayer();
println(metadataObjects);
// 3. 设置界面显示扫描结果
if (metadataObjects.count > 0) {
var obj:AVMetadataMachineReadableCodeObject = metadataObjects[0] as AVMetadataMachineReadableCodeObject;
// 提示:如果需要对url或者名片等信息进行扫描,可以在此进行扩展!
println("结果如下:" + obj.stringValue);
}
}
相关文章推荐
- iOS使用系统API扫描二维码条形码&限制扫描区域
- iOS开发:使用苹果自带框架实现二维码和条形码扫描
- 学习iOS开发之使用ZBar扫描二维码中文乱码问题
- ios-使用ZBar来扫描二维码/条形码
- 使用ZbarSDK实现扫描二维码以及条形码功能(iOS)
- iOS7使用原生API进行二维码和条形码的扫描
- 使用AVFoundation实现iOS原生二维码、条形码扫描(可限制扫描范围、可手动调节焦距)
- 在iOS中使用ZBar扫描二维码和条形码
- iOS- 详解如何使用ZBarSDK集成扫描二维码/条形码
- IOS原生API扫描二维码
- iOS自带的二维码扫描功能
- iOS自带扫描 和 生成二维码
- 在iOS中使用ZBar扫描二维码
- iOS自带扫描 和 生成二维码
- 在iOS中使用ZBar扫描二维码
- iOS 使用ZBarSDK扫描条形码和二维码
- iOS自带扫描 和 生成二维码
- iOS中使用ZBar扫描二维码自定义扫描界面
- iOS 使用ZBarSDK扫描条形码和二维码
- iOS自带扫描 和 生成二维码