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)")
}