web-dev-qa-db-fra.com

Détecter l'existence de la caméra dans l'application iPhone?

J'écris une application iOS et je dois pouvoir détecter si l'appareil dispose d'un appareil photo. Auparavant, je vérifiais si l'appareil était un iPhone ou non, car 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.

Alors, quelqu'un peut-il me fournir un code qui renvoie qu'il y ait un appareil photo ou non?

61
Origamiguy

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

if ([UIImagePickerController isSourceTypeAvailable: UIImagePickerControllerSourceTypeCamera])
   // Has camera
159
Vladimir

Rapide 3

Comme Juan Boero l'a écrit, vérifiez:

    if UIImagePickerController.isSourceTypeAvailable(.camera){ }

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

* veuillez 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)
}
21
Boaz Frenkel

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

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

Si vous utilisez UIImagePickerController, cela n'en vaut probablement pas la peine, car vous devrez ajouter AVFoundation.framework à votre projet.

21
prewett

Oui, une API est fournie pour cela:

BOOL isCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera];
19
Ben Zotto

Swift:

if UIImagePickerController.isSourceTypeAvailable(.Camera){

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

    print(UIImagePickerController.availableMediaTypesForSourceType(.Camera))

    }
11
Juan Boero

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

isCameraAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront];
6
RawMean