Improve QR scanner: prefer built-in camera, add rectOfInterest, fallback metadata types
This commit is contained in:
parent
8236b586c5
commit
f220800262
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user