Как я могу определить, ограничена ли камера пользователем

Я делаю приложение для iOS с кнопкой, которая запускает камеру.

Я хочу включить/отключить кнопку, если на устройстве есть камера или нет.

Я хочу определить, есть ли на устройстве камера, а также когда у устройства есть камера, но она ограничена (с помощью этого), чтобы вы не могу использовать его.

Как я могу обнаружить эти два варианта?

Спасибо


person A.Vila    schedule 31.05.2013    source источник
comment
Почему бы вам не проверить это на себе? Зачем публиковать вопрос?   -  person rmaddy    schedule 31.05.2013
comment
Я протестировал его и смог определить, есть ли на устройстве камера или нет, но я не могу определить, есть ли на устройстве камера, но она ограничена, поэтому вы не можете ее использовать.   -  person A.Vila    schedule 31.05.2013
comment
Извините, кажется, я неправильно понял, что вы сделали. Я думал, вы спрашиваете, работает ли этот код, если камера ограничена. Вот почему я предложил вам просто проверить это. Из любопытства, если вы настроите устройство с ограниченной камерой, что вернет isSourceTypeAvailable?   -  person rmaddy    schedule 31.05.2013
comment
Извините, я абсолютный новичок в ios, и я не знаю, как я пробовал это раньше. Теперь я попробовал еще раз, и isSourceTypeAvailable возвращает YES, когда камера не ограничена, и NO, когда она ограничена, как и ожидалось. Так что вопрос не имеет смысла. Прости.   -  person A.Vila    schedule 31.05.2013
comment
Я добавил ответ, используя isSourceTypeAvailable, чтобы другие люди могли легко видеть, что делать. Пожалуйста, примите этот ответ, если вы считаете, что этого достаточно!   -  person nickjm    schedule 30.07.2015


Ответы (5)


Как указано в другом месте, проверка AVAuthorizationStatus на самом деле не скажет вам, ограничено ли оно, несмотря на наличие «ограниченного» значения в перечислении. Вместо этого я обнаружил, что проверка того, включен ли источник, может быть полезной:

BOOL isCameraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];

Если isCameraAvailable равно NO, то пользователь, скорее всего, отключил камеру в ограничениях. См. Обнаружение наличия камеры в приложении iPhone?

person nickjm    schedule 30.07.2015

Чтобы проверить статус разрешения камеры в приложении, используйте следующий фрагмент кода.

@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");
          }
      }];
   }
}
person Pankaj Wadhwa    schedule 26.02.2015
comment
Обязательно импортируйте AVFoundation @import AVFoundation; - person Antoine; 03.05.2015
comment
Это не работает (по крайней мере, на iOS 8.4, которую я тестировал) для рассматриваемого сценария. Если у вас включена камера для приложения, но в целом она ограничена, оно вернет AVAuthorizationStatusAuthorized, что неверно. Честно говоря, я не знаю, почему существует AVAuthorizationStatusRestricted! - person nickjm; 29.07.2015
comment
@nickjm может быть и так. Я не проверял это для случая, который вы упомянули. - person Pankaj Wadhwa; 29.07.2015
comment
На самом деле это половина правильного ответа, и он ДЕЙСТВИТЕЛЬНО работает в iOS 9. Есть 3 состояния, которые могут отключить камеру. 1. Камера отсутствует, 2. Камера отключена специально для этого приложения и 3. Камера отключена через ограничения. Только это улавливает случай 2, но не случаи 1 и 3. [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] улавливает случаи 1 и 3, но не случай 2. Если вы хотите проверить все возможные причины, по которым камера может быть недоступна, вам необходимо реализовать это И isSourceTypeAvailable - person Chris Ostmo; 22.01.2016

Чтобы проверить, ограничена ли камера 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;
    }
}
person htzfun    schedule 10.06.2015

В первый раз, когда пользователь пытается использовать камеру на iOS 6, у него автоматически запрашивается разрешение. Вам не нужно добавлять дополнительный код (до этого статус авторизации был ALAuthorizationStatusNotDetermined).

Поэтому, если пользователь отказывает в первый раз, вы не можете спросить снова.

Вы можете использовать ALAssetsLibrary, чтобы проверить это. Проверьте этот ответ для этих решений: ask-permission-to-access-camera

Надеюсь, это поможет вам.

person Nishant Tyagi    schedule 31.05.2013
comment
Кажется, что ALAssetsLibrary просто сообщает вам, есть ли у вас доступ к фотографиям, а не к камере. - person Daniel T.; 13.10.2014

SWIFT 3

Чтобы решить, должна ли кнопка камеры быть включена (или скрыта), вы должны проверить:

    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)
}
person Boaz Frenkel    schedule 03.05.2017