Swift_相机扫描二维码、条形码

Object-C对应功能实现代码


  • 导入框架、遵循协议
import AVFoundation
// 协议
AVCaptureMetadataOutputObjectsDelegate
  • 检测设备相机
let authorizationStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
        switch authorizationStatus {
        case .notDetermined:
            AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { (genter) in
                if (genter){
                    self.openCamera()
                }else{
                    print(">>>访问受限")
                }
            }
            break
        case .authorized:
            self.openCamera()
            break
        case .restricted:
            print(">>>访问受限")
            break
        case .denied:
            print(">>>访问受限")
            break
        }
  • 设置相机的调用
private func openCamera() -> Void {
        guard let device = AVCaptureDevice.default(for: .video) else {
            return
        }
        // 输入
        var deviceInput:AVCaptureDeviceInput?
        do {
            deviceInput = try AVCaptureDeviceInput.init(device: device)
        } catch  {
            print(error)
        }
        if (deviceInput == nil) {
            return
        }
        // 输出
        let metadataOutput:AVCaptureMetadataOutput = AVCaptureMetadataOutput.init()
        metadataOutput.connection(with: .metadata)
        // 会话
        let session = AVCaptureSession.init()
        if session.canSetSessionPreset(.high){
            session.sessionPreset = .high
        }
        // 预览层
        let previewLayer: AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: session)
        previewLayer.videoGravity = .resizeAspectFill
                
        // 设置代理
        metadataOutput.setMetadataObjectsDelegate(self as AVCaptureMetadataOutputObjectsDelegate, queue: DispatchQueue.main)
        
        if session.canAddInput(deviceInput!) && session.canAddOutput(metadataOutput) {
            session.addInput(deviceInput!)
            session.addOutput(metadataOutput)
            // 设置元数据处理类型(注意, 一定要将设置元数据处理类型的代码添加到  会话添加输出之后)
            metadataOutput.metadataObjectTypes = [.code128, .qr]
        }
        // 添加预览图层
        let flag = view.layer.sublayers?.contains(previewLayer)
        if flag == false || flag == nil {
            previewLayer.frame = view.bounds
            view.layer.insertSublayer(previewLayer, at: 0)
        }
        // 启动会话
        session.startRunning()
    }
  • 处理扫描的数据
// Swift 4.0 以后改用此 API
    func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection){
        var resultStrs = [String]()
        for obj in metadataObjects {
            guard let codeObj = obj as? AVMetadataMachineReadableCodeObject else {
                return
            }
            resultStrs.append(codeObj.stringValue ?? "")
        }
        print("扫描结果::\(resultStrs)")
    }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值