2010-09-04 4 views
53

J'écris une application iOS, et je dois être en mesure de détecter si l'appareil dispose d'un appareil photo. Auparavant, je vérifiais si l'appareil est un iPhone ou non, puisque seul l'iPhone a un appareil photo - mais avec le lancement de l'iPod Touch 4, ce n'est plus une option viable. L'application fonctionne sans caméra, mais la présence d'une caméra ajoute des fonctionnalités. Donc, quelqu'un peut-il me fournir un code qui renvoie s'il y a un appareil photo ou non?Détecter l'existence d'une caméra dans l'application iPhone?

+0

Version rapide: [Link] (http://stackoverflow.com/a/33697919/1634890) –

Répondre

152

Vous pouvez utiliser la méthode +isSourceTypeAvailable: dans UIImagePickerController:

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

Attention: Si la caméra est "restreinte", cela retournera faux même si une caméra existe. – pulse4life

+0

Je travaille sur une application en ce moment avec l'accès à la caméra réglé à restreint, mais cela revient vrai, donc le commentaire de @ pulse4life n'est pas correct (du moins pas plus - en utilisant iOS 10). Pour l'autorisation d'accès, vous devez utiliser 'AVAuthorizationStatus'. – shim

+1

Je viens de tester à nouveau sur iOS 10.3.2. Il retournera faux si la caméra a été restreinte sur votre appareil. Par restreint je veux dire aller à Paramètres> Général> Restrictions et éteindre l'appareil photo (cela est généralement fait par un administrateur système). Je crois que c'est le comportement voulu par Apple car il n'est techniquement pas disponible même si une caméra existe. – pulse4life

19

Oui, il y a une API fournie pour faire exactement cela:

BOOL isCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 
19

Si vous utilisez les classes Foundation AV au lieu de UIImagePickerController vous peut faire:

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

Si vous utilisez UIImagePicker Contrôleur ça ne vaut probablement pas le coup, car il faudrait ajouter AVFoundation.framework à votre projet.

+17

Cela ne fonctionne pas nécessairement. Si des restrictions ont éteint la caméra, cela pourrait sortir le microphone comme un appareil, mais aucune caméra ne serait disponible.Mieux vaut utiliser [[AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo] count] – Jbryson

4

Si vous avez besoin de savoir si l'appareil est spécifiquement une caméra avant ou arrière, utilisez ceci:

isCameraAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]; 
+0

Cela devrait être la bonne réponse car cela ne dépend pas de l'état "restreint" – iGranDav

10

Swift:

if UIImagePickerController.isSourceTypeAvailable(.Camera){ 

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

    print(UIImagePickerController.availableMediaTypesForSourceType(.Camera)) 

    } 
-2

Pour vérifier la caméra est disponible (Swift)

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

SWIFT

Comme Juan Boero écrit vérifier le:

if UIImagePickerController.isSourceTypeAvailable(.camera){ } 

Mais j'ajouter une autre vérification pour voir si l'utilisateur autorisé à accéder à la caméra comme Apple suggère dans leur exemple PhotoPicker (PhotoPicker example Objective-C):

* S'il vous plaît noter que vous devez importer 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

merci pour le code exemple super pratique! – Fattie

Questions connexes