155

非常にシンプルなビデオアプリを開発しています。私は公式のコントロールを使用しています: UIImagePickerController.

これが問題です。初めて UIImagePickerController を提示するとき、iOS は許可を求めます。ユーザーは [はい] または [いいえ] をクリックできます。ユーザーが [いいえ] をクリックしても、コントロールは閉じられません。代わりに、ユーザーが開始ボタンをクリックし続けると、画面が常に黒い間はタイマーが作動し、ユーザーはタイマーを停止したり戻ったりすることができなくなります。ユーザーができる唯一のことは、アプリを強制終了することです。次に UIImagePickerController が表示されたとき、まだ黒い画面であり、ユーザーは [開始] をクリックしても戻ることができません。

バグなのかな?と思いました。UIImagePickerController を表示するかどうかを決定できるように、カメラの許可を検出する方法はありますか?

4

6 に答える 6

242

ケースを確認し、AVAuthorizationStatus適切に処理します。

NSString *mediaType = AVMediaTypeVideo;
AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:mediaType];
if(authStatus == AVAuthorizationStatusAuthorized) {
  // do your logic
} else if(authStatus == AVAuthorizationStatusDenied){
  // denied
} else if(authStatus == AVAuthorizationStatusRestricted){
  // restricted, normally won't happen
} else if(authStatus == AVAuthorizationStatusNotDetermined){
  // not determined?!
  [AVCaptureDevice requestAccessForMediaType:mediaType completionHandler:^(BOOL granted) {
    if(granted){
      NSLog(@"Granted access to %@", mediaType);
    } else {
      NSLog(@"Not granted access to %@", mediaType);
    }
  }];
} else {
  // impossible, unknown authorization status
}
于 2013-12-09T06:46:44.913 に答える
3

@Raptor からの回答への追加として、以下に言及する必要があります。iOS 10 以降、次のエラーが表示される場合があります。This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes.

これを修正するには、メイン スレッドからの結果を次のように処理するようにしてください (Swift 3)。

private func showCameraPermissionPopup() {
    let cameraMediaType = AVMediaTypeVideo
    let cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(forMediaType: cameraMediaType)

    switch cameraAuthorizationStatus {
    case .denied:
        NSLog("cameraAuthorizationStatus=denied")
        break
    case .authorized:
        NSLog("cameraAuthorizationStatus=authorized")
        break
    case .restricted:
        NSLog("cameraAuthorizationStatus=restricted")
        break
    case .notDetermined:
        NSLog("cameraAuthorizationStatus=notDetermined")

        // Prompting user for the permission to use the camera.
        AVCaptureDevice.requestAccess(forMediaType: cameraMediaType) { granted in
            DispatchQueue.main.sync {
                if granted {
                    // do something
                } else {
                    // do something else
                }
            }
        }
    }
}
于 2017-09-08T09:42:54.250 に答える