Как я могу определить, ограничена ли камера пользователем?
Я делаю приложение ios с кнопкой, запускающей камеру.
Я хочу включить/отключить кнопку, если у устройства есть камера или нет.
Я хочу определить, есть ли у камеры камера, а также когда у устройства есть камера, но она ограничена (это), поэтому вы не можете ее использовать.
Как я могу определить эти два параметра?
Спасибо
Ответы
Ответ 1
Как указано в другом месте, проверка AVAuthorizationStatus
на самом деле не скажет вам, ограничена ли она, несмотря на наличие "ограниченного" значения в перечислении.
Вместо этого я обнаружил, что проверка того, включен ли источник, полезен:
BOOL isCameraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
Если isCameraAvailable
- NO
, то пользователь, скорее всего, отключил камеру в "Ограничениях". См. Обнаружение существования камеры в приложении iPhone?
Ответ 2
Чтобы проверить статус разрешения камеры в приложении, используйте следующий фрагмент.
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");
}
}];
}
}
Ответ 3
Чтобы проверить ограниченность камеры 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
В первый раз, когда пользователь пытается использовать камеру на ios 6, он автоматически запрашивает разрешение. Вам не нужно добавлять дополнительный код (до этого авторизационное состояние - ALAuthorizationStatusNotDetermined).
Итак, если пользователь отказывается в первый раз, вы не можете снова спросить.
Вы можете использовать ALAssetsLibrary, чтобы проверить это.
Проверьте этот ответ на следующие решения:
ask-permission-to-access-camera
Надеюсь, это поможет вам.
Ответ 5
SWIFT 3
Чтобы решить, должна ли кнопка камеры быть включена (или скрыта), вы должны проверить:
if UIImagePickerController.isSourceTypeAvailable(.Camera){ }
Но тогда я бы проверял, разрешает ли пользователь доступ к камере, как показано на примере Apple, в примере с фотографией (Пример 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)
}