2013-05-31 17 views
15

Sto facendo un'app ios con un pulsante che avvia la fotocamera.Come posso rilevare se la telecamera è limitata dall'utente

Voglio abilitare/disabilitare il pulsante se il dispositivo ha una fotocamera disponibile o meno.

Voglio rilevare se il dispositivo è dotato di una fotocamera e anche quando il dispositivo è dotato di fotocamera ma è limitato (con this) quindi non è possibile utilizzarlo.

Come posso rilevare queste due opzioni?

Grazie

+0

Perché non provi tu stesso? Perché pubblicare una domanda? – rmaddy

+0

L'ho provato e sono stato in grado di rilevare se il dispositivo ha una fotocamera o meno ma non riesco a rilevare quando il dispositivo ha una fotocamera ma è limitato in modo da non poterlo utilizzare. –

+2

Scusa, penso di aver letto male ciò che hai fatto. Ho pensato che stavi chiedendo se quel codice funziona se la telecamera è stata limitata. Questo è il motivo per cui ti ho suggerito di testarlo. Per curiosità, se si imposta un dispositivo con una telecamera con restrizioni, cosa restituisce 'isSourceTypeAvailable'? – rmaddy

risposta

-6

Come già detto altrove, controllando il AVAuthorizationStatus non sarà effettivamente dire se è limitato, nonostante la presenza di un valore "limitato" nell'enum. Invece, ho scoperto che il controllo se l'origine è in grado di essere utile:

BOOL isCameraAvailable = [UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]; 

Se isCameraAvailable è NO quindi l'utente ha più probabile fotocamera disabile in Restrizioni.Vedere Detect existence of camera in iPhone app?

3

La prima volta che l'utente tenta di utilizzare per fotocamera su iOS 6 che lui/lei è chiesto automaticamente il permesso. Non è necessario aggiungere altro codice (prima che lo stato di autorizzazione sia ALAuthorizationStatusNotDeterminato).

Quindi se l'utente rifiuta la prima volta non è possibile chiedere nuovamente.

È possibile utilizzare ALAssetsLibrary per verificare questo. Controlla questa risposta per questa soluzione: ask-permission-to-access-camera

Spero che ti aiuti.

+0

Grazie, proverò –

+0

@ A.Vila segna questa risposta se risolve il tuo problema :-) –

+4

Sembra che ALAssetsLibrary ti dica solo se hai accesso alle foto, non alla fotocamera. –

24

Per controllare lo stato di autorizzazione della fotocamera in uso in seguito allo snippet.

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"); 
      } 
     }]; 
    } 
} 
+2

Assicurati di importare AVFoundation '@import AVFoundation;' – Antoine

+0

Questo non funziona (almeno su iOS 8.4 che ho testato) per lo scenario in questione. Se la fotocamera è stata abilitata per l'app ma è stata globalmente limitata, restituirà "AVAuthorizationStatusAuthorized" che non è corretto. Onestamente non sono sicuro del motivo per cui esiste "AVAuthorizationStatusRestricted"! – nickjm

+0

@nickjm bene che potrebbe essere il caso. Non l'ho testato per il caso che hai menzionato. – pankaj

4

Per verificare se la telecamera con restrizioni AVAuthorizationStatus non è sufficiente. Come detto nella documentazione:

Questo stato non è normalmente visibile: i metodi della classe AVCaptureDevice per la ricerca di dispositivi non restituiscono i dispositivi a cui l'utente non può accedere.

Quindi per controllo adeguato è necessario creare un po 'periferica di acquisizione, per esempio, come ho fatto io:

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; 
    } 
} 
0

SWIFT

per decidere se il pulsante della fotocamera dovrebbe nemmeno essere abilitato (o nascosta) Si dovrebbe controllare il:

if UIImagePickerController.isSourceTypeAvailable(.Camera){ } 

Ma poi vorrei controllare per vedere se l'utente ha consentito l'accesso alla fotocamera come suggerisce Apple nell'esempio PhotoPicker (PhotoPicker example Objective-C):

* per favore nota che devi 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) 
} 
Problemi correlati