How to write the access for camera

时光总嘲笑我的痴心妄想 提交于 2020-07-23 11:07:26

问题


Actually I am trying to implement a QR APP ,for that I am trying to add the permissions to access camera and I have written the permissions even though that permission alert is not coming .Can anyone help me out to do this.Thanks in advance.


回答1:


Add this code in your view controller class

import AVFoundation

    //Barcode Scanner
        let captureSession = AVCaptureSession()
        var videoPreviewLayer: AVCaptureVideoPreviewLayer!
        var initialized = false
        let barCodeTypes = [AVMetadataObject.ObjectType.upce,
                            AVMetadataObject.ObjectType.code39,
                            AVMetadataObject.ObjectType.code39Mod43,
                            AVMetadataObject.ObjectType.code93,
                            AVMetadataObject.ObjectType.code128,
                            AVMetadataObject.ObjectType.ean8,
                            AVMetadataObject.ObjectType.ean13,
                            AVMetadataObject.ObjectType.aztec,
                            AVMetadataObject.ObjectType.pdf417,
                            AVMetadataObject.ObjectType.itf14,
                            AVMetadataObject.ObjectType.dataMatrix,
                            AVMetadataObject.ObjectType.interleaved2of5,
                            AVMetadataObject.ObjectType.qr]

    override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)

            // this view is no longer topmost in the app, so we don't need a callback if we return to the app.
            NotificationCenter.default.removeObserver(self,
                                                      name: UIApplication.willEnterForegroundNotification,
                                                      object: nil)
        }

        @IBAction func btnScanQRPressed(_ sender: Any) {

            DispatchQueue.main.async {
                self.setupCapture()
            }
            // set observer for UIApplicationWillEnterForeground, so we know when to start the capture session again
            NotificationCenter.default.addObserver(self,
                                                   selector: #selector(willEnterForeground),
                                                   name: UIApplication.willEnterForegroundNotification,
                                                   object: nil)
        }

    // This is called when we return from another app to the scanner view
        @objc func willEnterForeground() {
            setupCapture()
        }

        func setupCapture() {
            var success = false
            var accessDenied = false
            var accessRequested = false

            let authorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
            if authorizationStatus == .notDetermined {
                // permission dialog not yet presented, request authorization
                accessRequested = true
                AVCaptureDevice.requestAccess(for: .video,
                                              completionHandler: { (granted:Bool) -> Void in
                                                self.setupCapture();
                })
                return
            }
            if authorizationStatus == .restricted || authorizationStatus == .denied {
                accessDenied = true
            }
            if initialized {
                success = true
            } else {
                if #available(iOS 10.2, *) {
                    let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera,
                                                                                                .builtInTelephotoCamera,
                                                                                                .builtInDualCamera],
                                                                                  mediaType: .video,
                                                                                  position: .unspecified)
                    if let captureDevice = deviceDiscoverySession.devices.first {
                        do {
                            let videoInput = try AVCaptureDeviceInput(device: captureDevice)
                            captureSession.addInput(videoInput)
                            success = true
                        } catch {
                            NSLog("Cannot construct capture device input")
                        }
                    } else {
                        NSLog("Cannot get capture device")
                    }
                } else {
                    // Fallback on earlier versions
                }

            }
            if success {
                DispatchQueue.global().async {
                    self.captureSession.startRunning()
                    DispatchQueue.main.async {
                        let captureMetadataOutput = AVCaptureMetadataOutput()
                        self.captureSession.addOutput(captureMetadataOutput)
                        let newSerialQueue = DispatchQueue(label: "barCodeScannerQueue") // in iOS 11 you can use main queue
                        captureMetadataOutput.setMetadataObjectsDelegate(self as AVCaptureMetadataOutputObjectsDelegate, queue: newSerialQueue)
                        captureMetadataOutput.metadataObjectTypes = self.barCodeTypes
                        self.videoPreviewLayer = AVCaptureVideoPreviewLayer(session: self.captureSession)
                        self.videoPreviewLayer.videoGravity = .resizeAspectFill
                        self.videoPreviewLayer.frame = self.view.layer.bounds
                        self.view.layer.addSublayer(self.videoPreviewLayer)
                    }
                }
                initialized = true
            } else {
                // Only show a dialog if we have not just asked the user for permission to use the camera.  Asking permission
                // sends its own dialog to th user
                if !accessRequested {
                    // Generic message if we cannot figure out why we cannot establish a camera session
                    var message = "Cannot access camera to scan bar codes"
                    #if (arch(i386) || arch(x86_64)) && (!os(macOS))
                    message = "You are running on the simulator, which does not hae a camera device.  Try this on a real iOS device."
                    #endif
                    if accessDenied {
                        message = "You have denied this app permission to access to the camera.  Please go to settings and enable camera access permission to be able to scan bar codes"
                    }
                    let alertPrompt = UIAlertController(title: "Cannot access camera", message: message, preferredStyle: .alert)
                    let confirmAction = UIAlertAction(title: "OK", style: .default, handler: { (action) -> Void in
                        self.navigationController?.popViewController(animated: true)
                    })
                    alertPrompt.addAction(confirmAction)
                    self.present(alertPrompt, animated: true, completion: nil)
                }
            }
        }

        func handleCapturedOutput(metadataObjects: [AVMetadataObject]) {
            if metadataObjects.count == 0 {
                return
            }

            guard let metadataObject = metadataObjects.first as? AVMetadataMachineReadableCodeObject else {
                return
            }

            if barCodeTypes.contains(metadataObject.type) {
                if let metaDataString = metadataObject.stringValue {
                    captureSession.stopRunning()
                    displayResult(code: metaDataString)
                    return
                }
            }
        }
    extension ViewController: AVCaptureMetadataOutputObjectsDelegate {

        func metadataOutput(_ output: AVCaptureMetadataOutput, didOutput metadataObjects: [AVMetadataObject], from connection: AVCaptureConnection) {
            handleCapturedOutput(metadataObjects: metadataObjects)
        }

    }

For Permissions in info.plist add,

    <key>NSCameraUsageDescription</key>
    <string>Will use it to scan Bar code for faster check-in and check-out </string>
    <key>NSPhotoLibraryUsageDescription</key>
    <string>Please allow access to save photo in your photo library</string>
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>Please allow access to save photo in your photo library</string>


来源:https://stackoverflow.com/questions/57285780/how-to-write-the-access-for-camera

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!