ユーザーがカメラの使用を許可したかどうかを確認するにはどうすればよいですか?


81

これを書こうとしています:

if usergavepermissiontousercamera  
  opencamera
else 
  showmycustompermissionview

この単純なタスクを実行する現在の方法が見つかりませんでした。
注:別の方法が必要な場合でも、iOS7でも機能するはずです


このリンクを確認する必要があります。stackoverflow.com/questions/25803217/…Swiftに翻訳するのは難しいことではありません。
mehdi.Sqalli 2014

AVCaptureDeviceとAVAuthorizationStatusはどちらもxcodeによって認識されない可能性がありますが、これはかなり困難です。
esqarrouth 2014

その答えを確認しました。それはカメラロールのためであり、それ
自体の

回答:


176

同じことを行うには、次のコードを使用できます。

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
       }
   })
}

注意:

  1. AVFoundationビルドフェーズのリンクバイナリセクションにフレームワークを追加してください
  2. import AVFoundationインポートするためにクラスに書き込む必要があります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
      }
   })
}

スウィフト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
        }
    })
}

ありがとう。リンクバイナリに追加せずにインポートが機能しました。しかし、私はフレームワークにFoundationを持っています。それは関係がありますか?
esqarrouth 2014

1
@Esq:Swift Importsによると、モジュールとしてアクセス可能なObjective-Cフレームワーク(またはCライブラリ)はSwiftに直接インポートできるため、バイナリをリンクする必要はありません。これには、Foundation、UIKit、SpriteKitなどのすべてのObjective-Cシステムフレームワークと、システムに付属の一般的なCライブラリが含まれます。Merry X'mas ...
Midhun MP 2014

ありがとう、あなたにもメリークリスマス:)ところで、ios7では、このメソッドは、リクエストを受け取っていなくても、すでに承認されています。それはなぜですか、どうすれば修正できますか?
esqarrouth 2014

@Esq:アプリに既に権限があり、設定アプリで設定されている場合、アプリは再度要求しません。権限があるかどうかを設定アプリで確認してください。
Midhun MP 2014

これを試す前に、シミュレーターの設定をリセットしました。行って設定を確認したところ、アプリについては何もありません。ios7.1シミュレーターで試してみる
Esqarrouth 2014

18

Swift3.0アップデートソリューション

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)
}

メソッドalertToEncourageCameraAccessInitiallyとalertPromptToAllowCameraAccessViaSettingの名前を混在させたと思います;)
jonaszmclaren 2017年

あなたは答えを改善することができます。いずれ良くなるだろう。そうでなければ、私が自由になるとき、私はそれをチェックします。ありがとう:)@ jonaszmclaren
Sourabh Sharma

14

以下は、Swift4.x用に更新されたクリーンアップされた回答です。

iOS 10以降、クラッシュを回避するために、info.plistファイルで権限をリクエストする必要もあります。

ここに画像の説明を入力してください

プライバシー-カメラの使用法の説明

このキーでユーザーに提示される文字列を提供する必要があります。そうしないと、カメラにアクセスしようとしたときにクラッシュが発生します。

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)
}

これにより、考えられる4つの回答がテストされ、許可されている場合は許可を要求するか、許可されている場合はnotDetermined有効にするための設定にユーザーを誘導しますdenied。の場合restricted、現在のユーザーはそれを有効にできない可能性がありますが、何らかの形でガイダンスを提供する必要があります。


9

これにより、ユーザーから許可が与えられたときにカメラが開きます。それ以外の場合は、許可を求めるアラートを表示します。

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)
            }
        }
}

この後、アラートを表示するためにこの関数を呼び出します

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)
    }

+1、小さな変更の後で私のために働いたので。初めての場合を除いてすべて良い.notDeterminedが真になるので、許可/拒否を要求するため、.authorizedの場合に行ったすべてのことを実行するか、ユーザーに「AVCaptureDevice.requestAccess(for :.video)」。次の試行から、最初の応答に基づいてスイッチケースが続きます。また、初めて拒否/許可するまで、プライバシー設定にこれは表示されません。
LokeshPurohit19年

2

デバイスのカメラを使用するときにシステムが権限自体を要求するため、上記の回答を変更し、最初のプロンプトを削除しました。

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)
}

2

AVFoundationフレームワークをインポートし、 以下に示すauthorizationStatus(for :)メソッドを使用して 、それぞれのケースを処理できます。

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
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.