How to check if the user gave permission to use the camera?

前端 未结 6 2036
余生分开走
余生分开走 2020-12-12 14:34

Trying to write this:

if usergavepermissiontousercamera  
  opencamera
else 
  showmycustompermissionview

Couldn\'t find a current way to d

相关标签:
6条回答
  • 2020-12-12 14:47

    Swift 3.0 Updated Solution

    func callCamera(){
        let myPickerController = UIImagePickerController()
        myPickerController.delegate = self;
        myPickerController.sourceType = UIImagePickerControllerSourceType.camera
    
        self.present(myPickerController, animated: true, completion: nil)
        NSLog("Camera");
    }
    func checkCamera() {
        let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
        switch authStatus {
        case .authorized: callCamera() // Do your stuff here i.e. callCameraMethod()
        case .denied: alertPromptToAllowCameraAccessViaSetting()
        case .notDetermined: alertToEncourageCameraAccessInitially()
        default: alertToEncourageCameraAccessInitially()
        }
    }
    
    func alertToEncourageCameraAccessInitially() {
        let alert = UIAlertController(
            title: "IMPORTANT",
            message: "Camera access required for capturing photos!",
            preferredStyle: UIAlertControllerStyle.alert
        )
        alert.addAction(UIAlertAction(title: "Cancel", style: .default, handler: nil))
        alert.addAction(UIAlertAction(title: "Allow Camera", style: .cancel, handler: { (alert) -> Void in
            UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
        }))
        present(alert, animated: true, completion: nil)
    }
    
    func alertPromptToAllowCameraAccessViaSetting() {
    
        let alert = UIAlertController(
            title: "IMPORTANT",
            message: "Camera access required for capturing photos!",
            preferredStyle: UIAlertControllerStyle.alert
        )
        alert.addAction(UIAlertAction(title: "Dismiss", style: .cancel) { alert in
            if AVCaptureDevice.devices(withMediaType: AVMediaTypeVideo).count > 0 {
                AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in
                    DispatchQueue.main.async() {
                        self.checkCamera() } }
            }
            }
        )
        present(alert, animated: true, completion: nil)
    }
    
    0 讨论(0)
  • 2020-12-12 14:48

    This will open the camera when permission is given by the user. Otherwise show alert for asking permission.

    func openCamera(){
            
            let authStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
            
            switch (authStatus){
                
            case .notDetermined, .restricted, .denied:
                showAlert(title: "Unable to access the Camera", message: "To enable access, go to Settings > Privacy > Camera and turn on Camera access for this app.")
            case .authorized:
                alert.dismiss(animated: true, completion: nil)
                if(UIImagePickerController .isSourceTypeAvailable(.camera)){
                    picker.sourceType = .camera
                    picker.showsCameraControls=true
                    picker.allowsEditing=true
                    self.viewController!.present(picker, animated: true, completion: nil)
                }
            }
    }
    

    after this call this function for showing alert

    func showAlert(title:String, message:String) {
            let alert = UIAlertController(title: title,
                                          message: message,
                                          preferredStyle: UIAlertController.Style.alert)
            
            let okAction = UIAlertAction(title: "OK", style: .cancel, handler: nil)
            alert.addAction(okAction)
            
            let settingsAction = UIAlertAction(title: "Settings", style: .default, handler: { _ in
                // Take the user to Settings app to possibly change permission.
                guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return }
                if UIApplication.shared.canOpenURL(settingsUrl) {
                    if #available(iOS 10.0, *) {
                        UIApplication.shared.open(settingsUrl, completionHandler: { (success) in
                            // Finished opening URL
                        })
                    } else {
                        // Fallback on earlier versions
                        UIApplication.shared.openURL(settingsUrl)
                    }
                }
            })
            alert.addAction(settingsAction)
            
            self.viewController!.present(alert, animated: true, completion: nil)
        }
    
    0 讨论(0)
  • 2020-12-12 14:51

    The following is a cleaned up answer updated for Swift 4.x:

    Starting with iOS 10, you must also request permission in the info.plist file to avoid a crash:

    Privacy - Camera Usage Description

    You must provide a string that is presented to the user with this key. Failure to do so will result in a crash when attempting to access the camera.

    import AVFoundation
    
    func checkCameraAccess() {
        switch AVCaptureDevice.authorizationStatus(for: .video) {
        case .denied:
            print("Denied, request permission from settings")
            presentCameraSettings()
        case .restricted:
            print("Restricted, device owner must approve")
        case .authorized:
            print("Authorized, proceed")
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: .video) { success in
                if success {
                    print("Permission granted, proceed")
                } else {
                    print("Permission denied")
                }
            }
        }
    }
    
    func presentCameraSettings() {
        let alertController = UIAlertController(title: "Error",
                                      message: "Camera access is denied",
                                      preferredStyle: .alert)
        alertController.addAction(UIAlertAction(title: "Cancel", style: .default))
        alertController.addAction(UIAlertAction(title: "Settings", style: .cancel) { _ in
            if let url = URL(string: UIApplicationOpenSettingsURLString) {
                UIApplication.shared.open(url, options: [:], completionHandler: { _ in
                    // Handle
                })
            }
        })
    
        present(alertController, animated: true)
    }
    

    This will test for the four possible answers, and then either request permission if it is notDetermined, or direct the user to settings to enable it if it is denied. If it is restricted, the current user may not be able to enable it, but you should provide some form of guidance to them.

    0 讨论(0)
  • 2020-12-12 14:53

    You can import the AVFoundation framework and use the authorizationStatus(for:) method shown below and handle the respective cases.

    switch AVCaptureDevice.authorizationStatus(for: .video) {
        case .authorized: // The user has previously granted access to the camera.
            self.setupCaptureSession()
    
        case .notDetermined: // The user has not yet been asked for camera access.
            AVCaptureDevice.requestAccess(for: .video) { granted in
                if granted {
                    self.setupCaptureSession()
                }
            }
    
        case .denied: // The user has previously denied access.
            return
        case .restricted: // The user can't grant access due to restrictions.
            return
    }
    
    0 讨论(0)
  • 2020-12-12 14:55

    I have modified the above answer and removed the initial prompt, since when we want to use device's camera the system is prompting for permissions itself:

    func checkPermissions() {
        let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
    
        switch authStatus {
        case .authorized:
            setupCamera()
        case .denied:
            alertPromptToAllowCameraAccessViaSetting()
        default:
            // Not determined fill fall here - after first use, when is't neither authorized, nor denied
            // we try to use camera, because system will ask itself for camera permissions
            setupCamera()
        }
    }
    
    func alertPromptToAllowCameraAccessViaSetting() {
        let alert = UIAlertController(title: "Error", message: "Camera access required to...", preferredStyle: UIAlertControllerStyle.alert)
    
        alert.addAction(UIAlertAction(title: "Cancel", style: .default))
        alert.addAction(UIAlertAction(title: "Settings", style: .cancel) { (alert) -> Void in
            UIApplication.shared.openURL(URL(string: UIApplicationOpenSettingsURLString)!)
        })
    
        present(alert, animated: true)
    }
    
    0 讨论(0)
  • 2020-12-12 15:03

    You can use the following code for doing the same:

    if AVCaptureDevice.authorizationStatusForMediaType(AVMediaTypeVideo) ==  AVAuthorizationStatus.Authorized {
        // Already Authorized
    } else {
        AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in
           if granted == true {
               // User granted
           } else {
               // User rejected
           }
       })
    }
    

    NOTE:

    1. Make sure that you add the AVFoundation Framework in the Link Binary section of build phases
    2. You should write import AVFoundation on your class for importing AVFoundation

    SWIFT 3

    if AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo) ==  AVAuthorizationStatus.authorized {
       // Already Authorized
    } else {
       AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (granted: Bool) -> Void in
          if granted == true {
             // User granted
          } else {
             // User Rejected
          }
       })
    }
    

    Swift 4

    if AVCaptureDevice.authorizationStatus(for: .video) ==  .authorized {
        //already authorized
    } else {
        AVCaptureDevice.requestAccess(for: .video, completionHandler: { (granted: Bool) in
            if granted {
                //access allowed
            } else {
                //access denied
            }
        })
    }
    
    0 讨论(0)
提交回复
热议问题