Невозможно отобразить предупреждение, если пользователь отказал в доступе к камере - PullRequest
0 голосов
/ 18 февраля 2019

Если пользователь отказал в доступе к камере, я показываю одно предупреждение с кнопкой отмены и кнопкой настройки, чтобы показать его.Но код не работает.

@IBAction func ProfileImageButton(_ sender: UIButton) {
        print("profile image Button is pressed")
        let imagePickerController = UIImagePickerController()
        imagePickerController.delegate = self
        profileimgbool = true
        let actionSheet = UIAlertController(title: "Photo Source", message: "choose a Source", preferredStyle: .actionSheet)

        actionSheet.addAction(UIAlertAction(title: "Camera", style: .default, handler: {(action:UIAlertAction) in imagePickerController.sourceType = .camera
            self.present(imagePickerController, animated: true, completion: nil)

        }))

        actionSheet.addAction(UIAlertAction(title: "Photo Library", style: .default, handler: {(action:UIAlertAction) in imagePickerController.sourceType = .photoLibrary
            self.present(imagePickerController, animated: true, completion: nil)}))

        actionSheet.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))



        self.present(actionSheet, animated: true, completion: nil)

    }

 func checkCameraPermission()  {
        let cameraMediaType = AVMediaType.video
        AVCaptureDevice.requestAccess(for: cameraMediaType) { granted in
            if granted {
                //Do operation
                print("Granted access for camera")
               // self.setCamera()
            } else {
                self.noCameraFound()
                print("Denied access for camera ")
            }
        }
    }
    func noCameraFound(){
        let alert = UIAlertController(title: "CallDoc", message: "Please allow camera access in phone settings", preferredStyle: UIAlertControllerStyle.alert)
        alert.addAction(UIAlertAction(title: "Back", style: UIAlertActionStyle.cancel, handler: {(action:UIAlertAction) in


        }));

        alert.addAction(UIAlertAction(title: "Open setting", style: UIAlertActionStyle.default, handler: {(action:UIAlertAction) in
            UIApplication.shared.open(NSURL(string:UIApplicationOpenSettingsURLString)! as URL, options: [:], completionHandler: nil)

        }));
        self.present(alert, animated: true, completion: nil)
    }

в моем коде выше мой метод был checkCameraPermission, где я буду вызывать это, чтобы показать предупреждение.Мне нужно показать, когда пользователь нажимает на камеру, и когда, если пользователь отрицает, черный экран будет отображаться вместо камеры.Там мне нужно показать всплывающее предупреждение.

Где я могу вызвать этот checkCameraPermission метод для отображения моего всплывающего окна?

Есть идеи?

1 Ответ

0 голосов
/ 18 февраля 2019

для справки. Я взял ответ из этого учебного пособия.

шаг 1

добавление основы avfoundation в ваш проект

import AVFoundation

шаг 2

не забудьте установить описание использования камеры в Info.plist

Когда вы запрашиваете разрешение на использование камеры устройства, короткое сообщениепоявится в системном диалоге iOS по умолчанию.Вы можете настроить это сообщение, добавив ключ Privacy - Camera Usage Description в свой файл Info.plist.

шаг 3

при действии кнопки изменения профиля изображения, проверьте разрешение и т. Д..

@IBAction func ProfileImageButton(_ sender: UIButton) {
 let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
  switch cameraAuthorizationStatus {
case .notDetermined: requestCameraPermission()
case .authorized: presentCamera()
case .restricted, .denied: alertCameraAccessNeeded()
}
}

на основании вышеуказанного действия, которое будет удовлетворять условие,

Если пользователь никогда не отвечал на запрос о доступе к своей камере, вам необходимо ответить с помощьюсистемное предупреждение iOS для запроса разрешения:

 func requestCameraPermission() {
AVCaptureDevice.requestAccess(for: .video, completionHandler: {accessGranted in
    guard accessGranted == true else { return }
    self.presentCamera()
})
}

там после продолжения доступа к камере

 func presentCamera() {
let photoPicker = UIImagePickerController()
photoPicker.sourceType = .camera
photoPicker.delegate = self as? UIImagePickerControllerDelegate & UINavigationControllerDelegate

self.present(photoPicker, animated: true, completion: nil)
}

Чтобы использовать изображение, снятое камерой, вам нужночтобы настроить контроллер представления на соблюдение и реализацию нескольких протоколов делегатов:

 class ViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
  // ...
 }

 func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : Any]) {
let photo = info[UIImagePickerControllerOriginalImage] as! UIImage
// do something with the photo... set to UIImageView, save it, etc.

dismiss(animated: true, completion: nil)
}

Если доступ к камере запрещен или ограничен, вы можете предупредить пользователя и направить его в приложение «Настройки», чтобысделать соответствующую корректировку разрешений:

func alertCameraAccessNeeded() {
let settingsAppURL = URL(string: UIApplicationOpenSettingsURLString)!

let alert = UIAlertController(
    title: "Need Camera Access",
    message: "Camera access is required to make full use of this app.",
    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.open(settingsAppURL, options: [:], completionHandler: nil)
}))

present(alert, animated: true, completion: nil)
}
...