123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- //
- // QrCodeReaderController.swift
- // deltachat-ios
- //
- // Created by Friedel Ziegelmayer on 28.12.18.
- // Copyright © 2018 Jonas Reinsch. All rights reserved.
- //
- import AVFoundation
- import UIKit
- protocol QrCodeReaderDelegate: class {
- func handleQrCode(_ code: String)
- }
- class QrCodeReaderController: UIViewController {
- var captureSession = AVCaptureSession()
- var videoPreviewLayer: AVCaptureVideoPreviewLayer?
- var qrCodeFrameView: UIView?
- weak var delegate: QrCodeReaderDelegate?
- private let supportedCodeTypes = [
- AVMetadataObject.ObjectType.qr,
- ]
- override func viewDidLoad() {
- super.viewDidLoad()
- let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(
- deviceTypes: [.builtInDualCamera],
- mediaType: AVMediaType.video,
- position: .back
- )
- guard let captureDevice = deviceDiscoverySession.devices.first else {
- print("Failed to get the camera device")
- return
- }
- do {
- let input = try AVCaptureDeviceInput(device: captureDevice)
- captureSession.addInput(input)
- let captureMetadataOutput = AVCaptureMetadataOutput()
- captureSession.addOutput(captureMetadataOutput)
- captureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
- captureMetadataOutput.metadataObjectTypes = supportedCodeTypes
- } catch {
- // If any error occurs, simply print it out and don't continue any more.
- logger.error("failed to setup QR Code Scanner: \(error)")
- return
- }
- videoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
- videoPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
- videoPreviewLayer?.frame = view.layer.bounds
- view.layer.addSublayer(videoPreviewLayer!)
- captureSession.startRunning()
- qrCodeFrameView = UIView()
- if let qrCodeFrameView = qrCodeFrameView {
- qrCodeFrameView.layer.borderColor = UIColor.green.cgColor
- qrCodeFrameView.layer.borderWidth = 2
- view.addSubview(qrCodeFrameView)
- view.bringSubviewToFront(qrCodeFrameView)
- }
- }
- override func didReceiveMemoryWarning() {
- super.didReceiveMemoryWarning()
- // Dispose of any resources that can be recreated.
- }
- }
- extension QrCodeReaderController: AVCaptureMetadataOutputObjectsDelegate {
- func metadataOutput(_: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from _: AVCaptureConnection) {
- if metadataObjects.isEmpty {
- qrCodeFrameView?.frame = CGRect.zero
- return
- }
- let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject
- if supportedCodeTypes.contains(metadataObj.type) {
- let barCodeObject = videoPreviewLayer?.transformedMetadataObject(for: metadataObj)
- qrCodeFrameView?.frame = barCodeObject!.bounds
- if metadataObj.stringValue != nil {
- DispatchQueue.main.async {
- self.captureSession.stopRunning()
- self.dismiss(animated: true) {
- self.delegate?.handleQrCode(metadataObj.stringValue!)
- }
- }
- }
- }
- }
- }
|