ios - name - ¿Cómo puedo detectar si la cámara está restringida por el usuario?
toolbar ios (5)
Estoy haciendo una aplicación ios con un botón que inicia la cámara.
Quiero habilitar / deshabilitar el botón si el dispositivo tiene una cámara disponible o no.
Quiero detectar si el dispositivo tiene una cámara y también cuando el dispositivo tiene cámara pero está restringido (con this ) para que no pueda usarla.
¿Cómo puedo detectar estas dos opciones?
Gracias
Como se indicó en otra parte, la verificación del Estado de AVAuthorizationStatus
realidad no le dirá si está restringido, a pesar de la presencia de un valor "restringido" en la enumeración. En su lugar, he encontrado que comprobar si la fuente está habilitada para ser útil:
BOOL isCameraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
Si isCameraAvailable
es NO
es probable que el usuario haya desactivado la cámara en Restricciones. Ver detectar la existencia de la cámara en la aplicación de iPhone?
La primera vez que el usuario intenta utilizar la cámara en ios 6, se le solicita permiso automáticamente. No es necesario agregar código adicional (antes de que el estado de autorización sea ALAuthorizationStatusNotDetermined).
Así que si el usuario niega la primera vez no puedes volver a preguntar.
Puedes usar ALAssetsLibrary para verificar esto. Verifique esta respuesta para estas soluciones: ask-permission-to-access-camera
Espero que te ayude.
Para comprobar si la cámara restringida AVAuthorizationStatus
no es suficiente. Como se dice en la documentación:
Este estado normalmente no es visible: los métodos de la clase AVCaptureDevice para descubrir dispositivos no devuelven dispositivos a los que el usuario no puede acceder.
Por lo tanto, para una verificación adecuada, debe crear algún dispositivo de captura, por ejemplo, como lo hice:
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;
}
}
Para verificar el estado de permisos de la cámara en la aplicación, utilice el siguiente fragmento de código
@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");
}
}];
}
}
SWIFT 3
Para decidir si el botón de la cámara debería estar habilitado (u oculto), debe verificar:
if UIImagePickerController.isSourceTypeAvailable(.Camera){ }
Pero luego verificaría si el usuario permitiera el acceso a la cámara como sugiere Apple en su ejemplo de PhotoPicker ( ejemplo de PhotoPicker Objective-C ):
* Tenga en cuenta que tiene que importar 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)
}