Set metadata types after session starts (availableMetadataObjectTypes empty before)

This commit is contained in:
yumoqing 2026-06-24 19:28:38 +08:00
parent e87921b59f
commit b929b1eb6e

View File

@ -155,22 +155,6 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
if session.canAddOutput(output) {
session.addOutput(output)
output.setMetadataObjectsDelegate(self, queue: .main)
// QR
if output.availableMetadataObjectTypes.contains(.qr) {
output.metadataObjectTypes = [.qr]
output.rectOfInterest = CGRect(x: 0.1, y: 0.1, width: 0.8, height: 0.8)
} else {
// fallback:
let types = output.availableMetadataObjectTypes.filter { $0 == .qr || $0 == .ean13 || $0 == .ean8 || $0 == .code128 }
if !types.isEmpty {
output.metadataObjectTypes = types
} else {
DispatchQueue.main.async { [weak self] in
self?.showError("Camera does not support QR code scanning")
}
return
}
}
}
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
@ -181,7 +165,6 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
// 线 UI
DispatchQueue.main.async { [weak self] in
guard let self = self, previewHost.window != nil else {
//
session.stopRunning()
return
}
@ -196,6 +179,24 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
//
DispatchQueue.global(qos: .userInitiated).async {
session.startRunning()
// session metadata types availableMetadataObjectTypes
if session.canAddOutput(output) == false,
output.availableMetadataObjectTypes.contains(.qr) {
output.metadataObjectTypes = [.qr]
} else {
//
let available = output.availableMetadataObjectTypes
if available.contains(.qr) {
output.metadataObjectTypes = [.qr]
} else if !available.isEmpty {
output.metadataObjectTypes = available
} else {
DispatchQueue.main.async { [weak self] in
self?.showError("Camera does not support QR scanning. Check System Settings → Privacy → Camera.")
}
}
}
}
}
}