【问题标题】:Unsupported type found - use -availableMetadataObjectTypes' issue找到不支持的类型 - 使用 -availableMetadataObjectTypes 问题
【发布时间】:2018-10-14 04:42:48
【问题描述】:

我正在尝试创建 QR 阅读器。但是,当我使用扫描仪打开窗口时,它崩溃并出现错误“由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'*** -[AVCaptureMetadataOutput setMetadataObjectTypes:] 找到不支持的类型 - 使用 -availableMetadataObjectTypes'”

这是我的代码:

import UIKit
import AVFoundation
import Alamofire
import SwiftyJSON

class CameraTwoViewController: UIViewController, 
AVCaptureMetadataOutputObjectsDelegate {

@IBOutlet weak var square: UIImageView!

var video = AVCaptureVideoPreviewLayer()

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //Creating session
    let session = AVCaptureSession()

    //Define capture devcie
    let captureDevice = AVCaptureDevice.default(for: .video)

    do
    {
        let input = try AVCaptureDeviceInput(device: captureDevice!)
    }
    catch
    {
        print ("ERROR")
    }

    let output = AVCaptureMetadataOutput()
    session.addOutput(output)

    output.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)

    output.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
    //output.metadataObjectTypes = [AVMetadataObject.availableMetadataObjectTypes.qr]

    video = AVCaptureVideoPreviewLayer(session: session)
    video.frame = view.layer.bounds
    view.layer.addSublayer(video)

    self.view.bringSubview(toFront: square)

    session.startRunning()
}

func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
    if metadataObjects != nil && metadataObjects.count != 0 {
        if let object = metadataObjects[0] as? AVMetadataMachineReadableCodeObject {
            if object.type == AVMetadataObject.ObjectType.qr {
                let alert = UIAlertController(title: "Your code is:", message: object.stringValue, preferredStyle: .alert)
                alert.addAction(UIAlertAction(title: "Retake", style: .default, handler: nil))
                alert.addAction(UIAlertAction(title: "Copy", style: .default, handler: { (nil) in
                    UIPasteboard.general.string = object.stringValue
                }))
                present(alert, animated: true, completion: nil)
            }
        }
    }
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}


}

提前谢谢你!

【问题讨论】:

    标签: swift camera avfoundation qr-code


    【解决方案1】:

    尝试在添加输出之前向会话添加输入。类似的东西:

    func configureScanner() {
    
        guard let captureDevice = AVCaptureDevice.default(for: .video) else {
            return
        }
    
        var input: AVCaptureDeviceInput?
        do {
            input = try AVCaptureDeviceInput(device: captureDevice)
        } catch let error {
            print(error.localizedDescription)
        }
    
        guard let indeedInput = input else {
            return
        }
        captureSession = AVCaptureSession()
        captureSession!.addInput(indeedInput)
    
        let captureMetadataOutput = AVCaptureMetadataOutput()
        captureSession!.addOutput(captureMetadataOutput)
    
        captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
        captureMetadataOutput.metadataObjectTypes = [AVMetadataObject.ObjectType.qr]
    
        ...
      }
    

    【讨论】:

      猜你喜欢
      • 2018-12-03
      • 2020-09-06
      • 1970-01-01
      • 2018-01-13
      • 1970-01-01
      • 2021-01-17
      • 2018-04-04
      • 2019-09-15
      • 1970-01-01
      相关资源
      最近更新 更多