Improve QR scanner: prefer built-in camera, add rectOfInterest, fallback metadata types

This commit is contained in:
yumoqing 2026-06-24 19:24:25 +08:00
parent 8236b586c5
commit f220800262

View File

@ -99,8 +99,17 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
// 线
private func setupCaptureOnBackground(previewHost: NSView) {
let session = AVCaptureSession()
session.sessionPreset = .high
guard let device = AVCaptureDevice.default(for: .video) else {
// Continuity Camera metadata
var device: AVCaptureDevice?
if let builtIn = AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .unspecified) {
device = builtIn
} else {
device = AVCaptureDevice.default(for: .video)
}
guard let device = device else {
DispatchQueue.main.async { [weak self] in
self?.showError("No camera available")
}
@ -125,11 +134,18 @@ class QRScannerWindowController: NSObject, AVCaptureMetadataOutputObjectsDelegat
// 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 {
DispatchQueue.main.async { [weak self] in
self?.showError("Camera does not support QR code scanning")
// 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
}
return
}
}