2010-09-04 28 views
53

Estoy escribiendo una aplicación para iOS, y necesito poder detectar si el dispositivo tiene una cámara. Previamente, verificaría si el dispositivo es un iPhone o no, ya que solo el iPhone tiene una cámara, pero con el lanzamiento del iPod Touch 4 ya no es una opción viable. La aplicación funciona sin una cámara, pero la presencia de una cámara agrega funcionalidad.¿Detecta la existencia de una cámara en la aplicación iPhone?

Entonces, ¿alguien puede proporcionarme un código que devuelva si hay una cámara o no?

+0

Versión Swift: [Enlace] (http://stackoverflow.com/a/33697919/1634890) –

Respuesta

152

Puede utilizar +isSourceTypeAvailable: método en el UIImagePickerController:

if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera]) 
    // Has camera 
+1

Cuidado: Si la cámara está "restringida", esto devolverá falso aunque exista una cámara. – pulse4life

+0

Estoy trabajando en una aplicación en este momento con el acceso a la cámara configurado como restringido, pero esto está volviendo verdadero, por lo que el comentario de @ pulse4life no es correcto (al menos, ya no es así - usando iOS 10). Para la autorización de acceso, debe usar 'AVAuthorizationStatus'. – shim

+1

Acabo de probar esto de nuevo en iOS 10.3.2. Devolverá falso si la cámara ha sido restringida en su dispositivo. Por restringido quiero decir ir a Configuración> General> Restricciones y apagar la cámara (esto generalmente lo hace un administrador del sistema). Creo que este es el comportamiento pretendido por Apple, ya que técnicamente no está disponible aunque exista una cámara. – pulse4life

19

Sí, hay una API proporcionada para hacer precisamente eso:

BOOL isCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 
19

Si está utilizando las clases Fundación AV en lugar de UIImagePickerController se puede hacer:

BOOL hasCamera = ([[AVCaptureDevice devices] count] > 0); 

Si usa UIImagePicker Controlador probablemente no valga la pena, ya que tendría que agregar AVFoundation.framework a su proyecto.

+17

Esto no necesariamente funciona. Si se activaron las restricciones de la cámara, esto podría emitir el micrófono como dispositivo, pero no habría cámara disponible.Es mejor usar [[AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo] count] – Jbryson

4

Si lo que necesita saber si el dispositivo tiene específicamente una cámara frontal o trasera, utilice esto:

isCameraAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]; 
+0

Esta debería ser la buena respuesta, ya que no depende del estado "restringido" – iGranDav

10

Swift:

if UIImagePickerController.isSourceTypeAvailable(.Camera){ 

    //Your code goes here 
    //For example you can print available media types: 

    print(UIImagePickerController.availableMediaTypesForSourceType(.Camera)) 

    } 
-2

Para comprobar de cámara está disponible (Swift)

if(!UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.Camera)) 
12

SWIFT

Como Juan Boero escribió comprobar el:

if UIImagePickerController.isSourceTypeAvailable(.camera){ } 

pero me gustaría añadir otra comprobación para ver si el usuario permite el acceso a la cámara como manzana sugiere en su ejemplo PhotoPicker (PhotoPicker example 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) 
} 
+1

¡gracias por el código de ejemplo super útil! – Fattie

Cuestiones relacionadas