2010-09-04 9 views
53

Sto scrivendo un'app per iOS e devo essere in grado di rilevare se il dispositivo ha una fotocamera. Precedentemente, controllerei se il dispositivo fosse un iPhone o meno, dal momento che solo l'iPhone ha una fotocamera - ma con il lancio dell'iPod Touch 4 questa non è più un'opzione praticabile. L'app funziona senza fotocamera, ma la presenza di una videocamera aggiunge funzionalità.Rileva l'esistenza della videocamera nell'app per iPhone?

Quindi, qualcuno può fornirmi un codice che restituisce se c'è una telecamera o no?

+0

Versione Swift: [Link] (http://stackoverflow.com/a/33697919/1634890) –

risposta

152

È possibile utilizzare +isSourceTypeAvailable: metodo UIImagePickerController:

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

Attenzione: se la telecamera è "limitata", restituirà false anche se esiste una telecamera. – pulse4life

+0

Attualmente sto lavorando a un'app con l'accesso della videocamera impostato su restricted ma questo è vero, quindi il commento di @ pulse4life non è corretto (almeno non più - usando iOS 10). Per l'autorizzazione all'accesso è necessario utilizzare 'AVAuthorizationStatus'. – shim

+1

L'ho appena testato su iOS 10.3.2. Restituirà false se la fotocamera è stata limitata sul tuo dispositivo. Con restrizioni intendo andare in Impostazioni> Generali> Restrizioni e spegnere la fotocamera (solitamente viene eseguita da un amministratore di sistema). Credo che questo sia il comportamento voluto da Apple perché tecnicamente non è disponibile anche se esiste una fotocamera. – pulse4life

19

sì, c'è un'API fornite per fare proprio questo:

BOOL isCamera = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 
19

Se si utilizzano le classi AV Fondazione invece di UIImagePickerController voi può fare:

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

Se si utilizza UIImagePicker Controller probabilmente non ne vale la pena, dato che dovresti aggiungere AVFoundation.framework al tuo progetto.

+17

Questo non funziona necessariamente. Se le restrizioni hanno attivato la fotocamera, questo potrebbe emettere il microfono come dispositivo, ma nessuna videocamera sarebbe disponibile.Meglio usare [[AVCaptureDevice devicesWithMediaType: AVMediaTypeVideo] count] – Jbryson

4

Se avete bisogno di sapere se il dispositivo ha specificamente una fotocamera frontale o posteriore, utilizzare questo:

isCameraAvailable = [UIImagePickerController isCameraDeviceAvailable:UIImagePickerControllerCameraDeviceFront]; 
+0

Questa dovrebbe essere la buona risposta dato che questo non si basa sullo stato "limitato" – iGranDav

10

Swift:

if UIImagePickerController.isSourceTypeAvailable(.Camera){ 

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

    print(UIImagePickerController.availableMediaTypesForSourceType(.Camera)) 

    } 
-2

Per controllare di fotocamera è disponibile (Swift)

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

SWIFT

Come Juan Boero scritto controllare la:

if UIImagePickerController.isSourceTypeAvailable(.camera){ } 

ma vorrei aggiungere un altro controllo per vedere se l'utente ha consentito l'accesso alla fotocamera come mela suggerisce nella loro esempio PhotoPicker (PhotoPicker example Objective-C):

* si prega di notare che dovete importare 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

grazie per il codice di esempio super-pratico! – Fattie

Problemi correlati