web-dev-qa-db-ja.com

カメラがユーザーによって制限されているかどうかを検出するにはどうすればよいですか

カメラを起動するボタンを使ってiOSアプリをやっています。

デバイスにカメラが使用可能かどうかにかかわらず、ボタンを有効/無効にしたい。

デバイスにカメラがあるかどうか、またデバイスにカメラがあるかどうかを検出したいのですが、制限されているため( this )、使用できません。

これらの2つのオプションをどのように検出できますか?

ありがとう

17
A.Vila

アプリでカメラの許可ステータスを確認するには、次のスニペットを使用します。

@import AVFoundation;

if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
 {
  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){
            NSLog(@"Granted access");
          } else {
            NSLog(@"Not granted access");
          }
      }];
   }
}
26
pankaj

カメラ制限AVAuthorizationStatusでは不十分かどうかを確認します。ドキュメントで述べたように:

通常、このステータスは表示されません。デバイスを検出するためのAVCaptureDeviceクラスのメソッドは、ユーザーがアクセスを制限されているデバイスを返しません。

したがって、適切なチェックを行うには、たとえば、次のようにキャプチャデバイスを作成する必要があります。

AVAuthorizationStatus authStatus = [AVCaptureDevice authorizationStatusForMediaType:AVMediaTypeVideo];
if (authStatus == AVAuthorizationStatusAuthorized) {
    BOOL atLeastOne = NO;
    NSArray *devices = [AVCaptureDevice devicesWithMediaType:AVMediaTypeVideo];
    for (AVCaptureDevice *device in devices) {
        if (device) {
            atLeastOne = YES;
        }
    }
    if (!atLeastOne) {
        authStatus = AVAuthorizationStatusRestricted;
    }
}
4
htzfun

ユーザーが初めてiOS6でカメラを使用しようとすると、自動的に許可を求められます。コードを追加する必要はありません(その前に、authorizationstatusはALAuthorizationStatusNotDeterminedです)。

したがって、ユーザーが最初に拒否した場合、再度質問することはできません。

ALAssetsLibraryを使用してこれを確認できます。この解決策については、この回答を確認してください: ask-permission-to-access-camera

それがあなたを助けることを願っています。

3
Nishant Tyagi

Swift3

カメラボタンを有効(または非表示)にするかどうかを決定するには、以下を確認する必要があります。

    if UIImagePickerController.isSourceTypeAvailable(.Camera){ }

しかし、次に、AppleがPhotoPickerの例( PhotoPickerの例Objective-C )で示唆しているように、ユーザーがカメラへのアクセスを許可したかどうかを確認します。

* AVFoundationをインポートする必要があることに注意してください

let authStatus = AVCaptureDevice.authorizationStatus(forMediaType: AVMediaTypeVideo)

if authStatus == AVAuthorizationStatus.denied {
    // Denied access to camera
    // Explain that we need camera access and how to change it.
    let dialog = UIAlertController(title: "Unable to access the Camera", message: "To enable access, go to Settings > Privacy > Camera and turn on Camera access for this app.", preferredStyle: UIAlertControllerStyle.alert)

    let okAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: nil)

    dialog.addAction(okAction)
    self.present(dialog, animated:true, completion:nil)

} else if authStatus == AVAuthorizationStatus.notDetermined {     // The user has not yet been presented with the option to grant access to the camera hardware.
    // Ask for it.
    AVCaptureDevice.requestAccess(forMediaType: AVMediaTypeVideo, completionHandler: { (grantd) in
    // If access was denied, we do not set the setup error message since access was just denied.
       if grantd {
       // Allowed access to camera, go ahead and present the UIImagePickerController.
            self.showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType.camera)
        }
    })
} else {

    // Allowed access to camera, go ahead and present the UIImagePickerController.
    self.showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType.camera)

}

func showImagePickerForSourceType(sourceType: UIImagePickerControllerSourceType) {

    let myPickerController = UIImagePickerController()
    myPickerController.delegate = self;
    myPickerController.sourceType = sourceType  
    self.present(myPickerController, animated: true, completion: nil)
}
1
Boaz Frenkel