簡単に実装したサンプルです。参考になると幸いです。
asa08/QRreader
カメラを設定する
import AVFoundation
して、AVCaptureSession
をインスタンスを生成します。
private let session = AVCaptureSession()
次に、カメラの設定を行います。
// カメラの設定
// 今回は背面カメラなのでposition: .back
let discoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: .video, position: .back)
let devices = discoverySession.devices
if let backCamera = devices.first {
do {
// カメラでQRの読み取りに成功した時の処理
let deviceInput = try AVCaptureDeviceInput(device: backCamera)
doInit(deviceInput: deviceInput)
} catch {
print("Error occured while creating video device input: \(error)")
}
}
doInit()
の中でデコードを行います。
private func doInit(deviceInput: AVCaptureDeviceInput) {
if !session.canAddInput(deviceInput) { return }
session.addInput(deviceInput)
let metadataOutput = AVCaptureMetadataOutput()
if !session.canAddOutput(metadataOutput) { return }
session.addOutput(metadataOutput)
metadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
metadataOutput.metadataObjectTypes = [.qr]
// カメラを起動
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.frame = view.bounds
previewLayer.videoGravity = .resizeAspectFill
caputureView.layer.addSublayer(previewLayer)
session.startRunning()
}
func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
for metadata in metadataObjects as! [AVMetadataMachineReadableCodeObject] {
// QRのtype: metadata.type
// QRの中身: metadata.stringValue
guard let value = metadata.stringValue else { return }
session.stopRunning()
textLavel.text = value
caputureView.isHidden = true
}
}
これでカメラで読み取ったQRから文字列を取得することができます。