2013-05-31 2 views
15

Я делаю приложение ios с кнопкой, запускающей камеру.Как определить, ограничена ли камера пользователем

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

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

Как определить эти два варианта?

Благодаря

+0

Почему бы вам не проверить это самостоятельно? Зачем ставить вопрос? – rmaddy

+0

Я протестировал его, и я смог определить, есть ли у устройства камера или нет, но я не могу обнаружить, когда у устройства есть камера, но он ограничен, поэтому вы не можете его использовать. –

+2

Извините, я думаю, что неправильно понял, что вы сделали. Я думал, вы спрашиваете, работает ли этот код, если камера была ограничена. Вот почему я предложил вам просто проверить это. Из любопытства, если вы настроите устройство с ограниченной камерой, что возвращает 'isSourceTypeAvailable'? – rmaddy

ответ

-6

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

BOOL isCameraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 

Если isCameraAvailable является NO, то пользователь имеет, скорее всего, отключил камеру в ограничении.См Detect existence of camera in iPhone app?

3

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

Так что если пользователь отказывается в первый раз, вы не можете снова спросить.

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

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

+0

Спасибо, я попробую –

+0

@ A.Vila отметьте это, если он решает вашу проблему :-) –

+4

Кажется, что ALAssetsLibrary просто сообщает вам, есть ли у вас доступ к фотографиям, а не к камере. –

24

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

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"); 
      } 
     }]; 
    } 
} 
+2

Обязательно импортируйте AVFoundation '@import AVFoundation;' – Antoine

+0

Это не работает (по крайней мере, на IOS 8.4, который я тестировал) для рассматриваемого сценария. Если у вас включена камера для приложения, но она ограничена в целом, она вернет 'AVAuthorizationStatusAuthorized', что неверно. Я честно не знаю, почему существует 'AVAuthorizationStatusRestricted'! – nickjm

+0

@nickjm хорошо, что может быть. Я не проверял его на случай, о котором вы упоминали. – pankaj

4

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

СВИФТ

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

if UIImagePickerController.isSourceTypeAvailable(.Camera){ } 

Но тогда я хотел бы проверить, чтобы убедиться, пользователь разрешил доступ к камере, поскольку яблоко предлагает в своем примере PhotPicker (PhotoPicker example 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) 
}