Search code examples
swift4firebase-mlkit

Should one can scan a barcode in portrait mode using ML Kit?


I had tried and able to scan the barcode using ML Kit in landscape mode of iPhone and landscape as well as portrait mode of iPad but there is some issue with iPhone portrait mode barcode scanning I am unable to san the code in portrait mode is any one had tried of face this issue than please help me to get fix the same.

Thanks in advance.


Solution

  • import Foundation import UIKit import AVFoundation import Firebase

    class CameraView: UIView { override class var layerClass: AnyClass { get { return AVCaptureVideoPreviewLayer.self } } override var layer: AVCaptureVideoPreviewLayer { get { return super.layer as! AVCaptureVideoPreviewLayer } } }

    class ViewController : UIViewController, AVCaptureVideoDataOutputSampleBufferDelegate {

    let session = AVCaptureSession()
    lazy var vision = Vision.vision()
    var barcodeDetector :VisionBarcodeDetector?
    
    // Camera view
    var cameraView: CameraView!
    
    override func loadView()
    {
        cameraView = CameraView()
        view = cameraView
    }
    
    override func viewDidLoad()
    {
        super.viewDidLoad()
        startLiveVideo()
        self.barcodeDetector = vision.barcodeDetector()
    
    }
    
    func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection)
    {
        if let barcodeDetector = self.barcodeDetector
        {
            let visionImage = VisionImage(buffer: sampleBuffer)
    
            barcodeDetector.detect(in: visionImage) { (barcodes, error) in
    
                if let error = error
                {
                    print(error.localizedDescription)
                    return
                }
    
                for barcode in barcodes!
                {
                    print(barcode.displayValue!)
                    let alertController = UIAlertController(title: "Barcode Scanned", message: barcode.displayValue, preferredStyle: .alert)
                    alertController.addAction(UIAlertAction(title: "OK", style: .default, handler:nil))
                    self.present(alertController, animated: true, completion: nil)
                }
            }
        }
    }
    
    
    private func startLiveVideo()
    {
        session.sessionPreset = AVCaptureSession.Preset.high
        let captureDevice = AVCaptureDevice.default(for: AVMediaType.video)
    
        let deviceInput = try! AVCaptureDeviceInput(device: captureDevice!)
        let deviceOutput = AVCaptureVideoDataOutput()
        deviceOutput.videoSettings = [kCVPixelBufferPixelFormatTypeKey as String: Int(kCVPixelFormatType_32BGRA)]
        deviceOutput.setSampleBufferDelegate(self, queue: DispatchQueue.global(qos: DispatchQoS.QoSClass.default))
        session.addInput(deviceInput)
        session.addOutput(deviceOutput)
    
        let imageLayer = AVCaptureVideoPreviewLayer(session: session)
    
        session.commitConfiguration()
        cameraView.layer.session = session
        cameraView.layer.videoGravity = AVLayerVideoGravity.resizeAspectFill
    
        cameraView.layer.addSublayer(imageLayer)
        session.startRunning()
    }
    

    }