iOS Camera permissions doesn't appear under settings in some devices

前端 未结 5 1239
南笙
南笙 2021-02-14 16:00

I\'m having some issues trying to use the camera. The problem is that some devices show me the Camera entry under settings, and some others don\'t. In those devices where the Ca

相关标签:
5条回答
  • 2021-02-14 16:34

    If the above solutions didn't work you may consider checking this setting on iOS device.

    0 讨论(0)
  • 2021-02-14 16:44

    I need the camera to user ARKit. Every time the vc with sceneView is shown I run the checkCameraPermission() in viewWillAppear. If the user doesn't allow access an alert will show with a settingsButton. Once they press that button they will be taken to Settings and the camera icon with the toggle switch will always be there.

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
    
        checkCameraPermission()
    }
    
    func checkCameraPermission() {
    
        let authorizationStatus = AVCaptureDevice.authorizationStatus(for: AVMediaType.video)
        switch authorizationStatus {
    
        case .notDetermined:
            AVCaptureDevice.requestAccess(for: AVMediaType.video) { [weak self](granted) in
                if granted {
                    print("access granted")
                    DispatchQueue.main.async { [weak self] in
                        self?.startSceneViewSession()
                    }
    
                } else {
                    print("access denied")
                    DispatchQueue.main.async { [weak self] in
                        self?.alertUserCameraPermissionMustBeEnabled()
                    }
                }
            }
    
        case .authorized:
            print("Access authorized")
            startSceneViewSession()
    
        case .denied, .restricted:
            print("restricted")
            alertUserCameraPermissionMustBeEnabled()
    
        @unknown default:
            fatalError()
        }
    }
    
    func alertUserCameraPermissionMustBeEnabled() {
    
        let message = "Camera access is necessary to use Augemented Reality for this app.\n\nPlease go to Settings to allow access to the Camera.\n Please switch the button to the green color."
    
        let alert = UIAlertController (title: "Camera Access Required", message: message, preferredStyle: .alert)
    
        let settingsAction = UIAlertAction(title: "Settings", style: .default, handler: { (action) in
    
            guard let settingsUrl = URL(string: UIApplication.openSettingsURLString) else { return }
    
            if UIApplication.shared.canOpenURL(settingsUrl) {
                UIApplication.shared.open(settingsUrl, completionHandler: { (_) in
                })
            }
        })
    
        alert.addAction(settingsAction)
    
        present(alert, animated: true, completion: nil)
    }
    
    // this is for ARKit
    func startSceneViewSession() {
        sceneView.session.run(configuration)
        sceneView.isPlaying = true
    }
    
    0 讨论(0)
  • 2021-02-14 16:50

    Step 1: Give a proper camera message access message on your info.plist using the following key (without quotes)

    "Privacy - Camera Usage Description"
    

    Step 2 : For objective-C/SWIFT you need to request a camera access permission

    OBJECTIVE-C

    [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted)
            {
                if (granted == true)
                {
                    //[self presentViewController           : picker animated:YES completion:NULL];
                   //Do your stuff
    
                }
                else
                {
                    UIAlertView *cameraAlert = [[UIAlertView alloc]initWithTitle:STR_APPLICATION_TITLE
                                                                         message:STR_ALERT_CAMERA_DENIED_MESSAGE
                                                                        delegate:self
                                                               cancelButtonTitle:@"OK"
                                                               otherButtonTitles:nil,nil];
                    [cameraAlert show];
    
                    NSLog(@"denied");
                }
    
            }];
    

    SWIFT

    AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (videoGranted: Bool) -> Void in
            if (videoGranted) {
                 //Do Your stuff here
    
            } else {
                // Rejected Camera
            }
        })
    
    0 讨论(0)
  • 2021-02-14 16:50

    I had the same problem until I changed my camera type to wide:

       let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [.builtInWideAngleCamera], mediaType: AVMediaType.video, position: .back)
    
    0 讨论(0)
  • 2021-02-14 16:51

    You need to request permission before opening a session. Use

    [AVCaptureDevice requestAccessForMediaType:completionHandler:]
    
    0 讨论(0)
提交回复
热议问题