74

私のアプリが iOS 8 で初めてカメラにアクセスしようとすると、iOS 7 のマイク アクセス用のマイクのような、カメラのアクセス許可ダイアログがユーザーに表示されます。

iOS 7 では、事前にマイクの許可ダイアログを呼び出して、許可が付与されているかどうかを確認することができました (たとえば、この質問を参照してください)。iOS 8 でカメラの許可ダイアログを呼び出す同様の方法はありますか? マイクとカメラのアクセス許可のためにダイアログを組み合わせることができますか?

4

9 に答える 9

62

ユーザーが最初にプロンプ​​トが表示されたときにカメラへのアクセスを拒否した場合、ボタンを押してスナップショットを撮ると、カメラモードで黒い画面が表示されます。

ただし、ユーザーがアクセスを拒否したことを検出し、オンにする必要があることを確認したいのですが、現在のユーザーのカメラ アクセスを確認する機能が見つかりません。そのような機能はありますか?

編集: 次のチェックにより、IOS 8 でカメラ アクセスについて通知されます。

#import <AVFoundation/AVFoundation.h>

AVAuthorizationStatus status = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
    
    if(status == AVAuthorizationStatusAuthorized) { // authorized
        
    }
    else if(status == AVAuthorizationStatusDenied){ // denied
        
    }
    else if(status == AVAuthorizationStatusRestricted){ // restricted
        
        
    }
    else if(status == AVAuthorizationStatusNotDetermined){ // not determined
        
        [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
            if(granted){ // Access has been granted ..do something
               
            } else { // Access denied ..do something
               
            }
        }];
    }

この情報は、次の質問 ( iOS8 でアプリケーションがカメラにアクセスできるか、プログラムでアクセスできないかを知る方法) で見つかりました。

于 2014-09-23T18:42:53.637 に答える
54

これが私の Swift ソリューション (iOS 8) です。QR スキャン用のカメラが必要だったので、実際にその使用を促す必要がありました。

これにより、

  1. デフォルトのカメラ アクセス許可の質問の前に、許可を選択するようユーザーに促します。

  2. ユーザーが最初の要求を拒否した場合に設定にアクセスする簡単な方法。

ViewDidAppear/またはViewDidLoadなどでコールチェックカメラを実行するには、viewDidAppearを使用する必要があったため、カスタムカメラビューの制約が設定されました。

func checkCamera() {
    let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)
    switch authStatus {
    case .authorized: break // Do your stuff here i.e. allowScanning()
    case .denied: alertToEncourageCameraAccessInitially()
    case .notDetermined: alertPromptToAllowCameraAccessViaSetting()
    default: alertToEncourageCameraAccessInitially()
    }
}

func alertToEncourageCameraAccessInitially() {
    let alert = UIAlertController(
        title: "IMPORTANT",
        message: "Camera access required for QR Scanning",
        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: "Please allow camera access for QR Scanning",
        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)
}

dispatch_async を使用するためのヒントについては、上記の jamix に感謝します - 新しく設定されたカメラ機能を表示するための応答が非常に高速になります。

末尾のクロージャーが混在して申し訳ありません..それらを試してみたかった.

于 2015-06-27T08:39:34.730 に答える
16

マイクとカメラの両方のアクセス許可を確認する回答はないようです。私たちのコードは、カメラのアクセス許可が付与されているが、マイクへのアクセスが拒否されているシナリオをチェックします。

私たちは Swift に慣れていないので、ぎこちなくネストされたクロージャーとifステートメントが最適である可能性は低いです。コードを改善するための提案を共有してください! しかし、少なくともテストではこれまでのところ機能しています。

    AVCaptureDevice.requestAccessForMediaType(AVMediaTypeVideo, completionHandler: { (videoGranted: Bool) -> Void in
        if (videoGranted) {
            AVCaptureDevice.requestAccessForMediaType(AVMediaTypeAudio, completionHandler: { (audioGranted: Bool) -> Void in
                if (audioGranted) {
                    dispatch_async(dispatch_get_main_queue()) {
                        // Both video & audio granted
                    }
                } else {
                    // Rejected audio
                }
            })
        } else {
            // Rejected video
        }
    })
于 2015-07-07T08:28:36.323 に答える
8
  • Swift 3.0 ソリューション

    AVFoundation のインポート

注: Info.plist に Privacy - Camera Usage Description キーを追加します。

//MARK: カメラの取り扱い

        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: alertToEncourageCameraAccessInitially()
            case .notDetermined: alertPromptToAllowCameraAccessViaSetting()
            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)
        }
于 2016-12-22T08:42:01.133 に答える
5

viewWillAppearSwift 3 の場合、最初のビュー コントローラーのメソッドにこれを追加できます。

AVFoundation最初にフレームワークをインポートします

import AVFoundation

それで:

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

    let authorizationStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)

    switch authorizationStatus {
    case .notDetermined:
        AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo) { granted in
            if granted {
                print("access granted")
            }
            else {
                print("access denied")
            }
        }
    case .authorized:
        print("Access authorized")
    case .denied, .restricted:
        print("restricted")

    }
}

Privacy - Camera Usage Descriptionキーを追加することを忘れないでくださいInfo.plist

于 2016-11-14T16:35:57.113 に答える
4

私にとって、これは iOS7 と iOS8 で動作します:

    ALAuthorizationStatus status = [ALAssetsLibrary authorizationStatus];

    switch (status) {
        case ALAuthorizationStatusAuthorized:
            break;

        case ALAuthorizationStatusRestricted:
        case ALAuthorizationStatusDenied:
            break;

        case ALAuthorizationStatusNotDetermined:
            break;
    }
于 2015-03-02T23:12:15.840 に答える