2012-05-20 1 views
27

Quando [camera takePicture] viene chiamato prima che la fotocamera è pronta, sputa fuori questo messaggio:Come sapere se la fotocamera dell'iPhone è pronta per scattare foto?

UIImagePickerController: ignoring request to take picture; camera is not yet ready.

Come faccio a sapere quando è pronto per scattare una foto?

[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] restituisce sempre true, anche se apparentemente non è pronto.

+0

domanda simile a http://stackoverflow.com/questions/6817920/recored-video-using-uiimagepickercontroller - la risposta selezionata è corretto, ma c'è un'altra risposta che parla di aggiungere un ritardo. Questo è probabilmente un buon punto di partenza. – Tass

+0

Inoltre, consultare http://stackoverflow.com/questions/4377303/uiimagepickercontroller-camera-not-ready - sembra che ci sia un codice di ritorno quando la fotocamera non è pronta. Controlla il risultato, attendi e riprova. – Tass

+0

Spero davvero che un ritardo non sia l'unica strada da percorrere, anche se sembra che sia così. Sicuramente c'è una soluzione migliore ... –

risposta

46

Come @djromero detto che c'è una soluzione utilizzando AVFoundation (ma non invece di UIImagePickerController. Basta usare AVFoundation per ottenere una notifica indietro).

[[NSNotificationCenter defaultCenter] addObserver:self 
             selector:@selector(cameraIsReady:) 
              name:AVCaptureSessionDidStartRunningNotification object:nil]; 

E poi, una volta che la fotocamera è pronta avete ottenuto il vostro notifica:

- (void)cameraIsReady:(NSNotification *)notification 
{ 
    NSLog(@"Camera is ready..."); 
    // Whatever 
} 

ho appena provato chiamando takePicture dopo UIImagePickerController presentazione (dove ho avuto la 'fotocamera non è pronta' messaggio) e proprio all'interno del mio callback di notifica, dove ha funzionato come un fascino.

Side-note:

[camera isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera] restituisce sempre Yes perché controlla solo che c'è un dispositivo di macchina fotografica a disposizione. Di fatto, Apple consiglia di verificare sempre che questo restituisca Yes e che si disponga di un delegato non nullo (per fornire un modo per effettuare il dismiss tramite l'interfaccia standard) prima di provare a inizializzare e presentare il controller.

+0

Risposta stupenda. Questo è incredibilmente utile. Non ho ancora avuto la possibilità di collegarlo, ma sto assumendo dai fattori positivi che funziona. Grazie Alladinian !!! –

+0

@JamesSkidmore Prego! In effetti, questo è così utile che Apple dovrebbe averlo documentato meglio o almeno fornire un api di livello superiore (tramite un metodo delegato per esempio) all'interno di "UIImagePickerController'. – Alladinian

+0

Questo non funziona in iOS 4.2.1. Nessun errore, è solo che il metodo di callback non viene mai eseguito. Qualche idea? –

1

A dire il vero non l'ho provato e la documentazione è in qualche modo ambigua, ma che dire di [UIImagePickerController isCameraDeviceAvailable:...]?

EDIT: Come ho appena saputo, questa non è la soluzione per il tuo problema. Mi dispiace, ho pensato che potrebbe essere la pena di provare ...

+0

Sì, purtroppo non risolve il problema. Grazie comunque Stefan. –

-1

Se si utilizza UIImagePickerController, di seguito è riportato il codice per il video, codice simile implica anche per l'immagine.

UIImagePickerController *picker; 
BOOL cameraIsOn; 

quindi controllare dispositivo fotocamera disponibili

if ([UIImagePickerController isCameraDeviceAvailable:[picker cameraDevice]]) { 
      if (cameraIsOn) { 
       NSLog(@"stop camera"); 
       [picker stopVideoCapture]; 
       cameraIsOn = FALSE; 
      } 
      else { 
       NSLog(@"start camera"); 
       [picker startVideoCapture]; 
       self.videoTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(changeValue) userInfo:nil repeats:YES]; 
       cameraIsOn = TRUE; 
      } 
     } 
0

Cosa @Alladinian detto era più disponibile, questa risposta è supplementare a quello. Raccomando di usare la sua tecnica AVCaptureSessionDidStartRunningNotification come quella che ti dice quando la fotocamera è pronta inizialmente (ma questo è chiamato solo una volta). Mi preoccupo anche se il dispositivo è pronto per le immagini successive. Non ho trovato la soluzione migliore, perché non vedo alcuna richiamata per il dispositivo che non si riferisce alla sessione della videocamera. Ma questa funzione di callback sembra essere abbastanza buono:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info 

nota la fotocamera molto probabilmente sarà pronto prima che callback si chiama, ed è possibile stipare in una o due foto, ma sembra che la fotocamera sarà sicuramente pronto per il momento in cui viene richiamato il callback. Questo dovrebbe impedirti di ottenere il seguente errore tra più riprese della fotocamera.

UIImagePickerController: ignoring request to take picture; image is already being captured or camera not yet ready. 
-1

Questo fa in modo di iniziare a catturare il video non appena fotocamera è pronta

imgpicker = [[UIImagePickerController alloc] init]; 
[self presentViewController:imgpicker animated:YES completion:^(void){  
while(![imgpicker startVideoCapture]); 
}]; 
0

Come per la documentazione per UIImagePickerController. Il metodo takePicture() è nuovamente pronto quando

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) { 

viene chiamato. Se sei interessato a bloccare le immagini durante questo periodo, disattiva l'interfaccia del pulsante (button.userInterfaceEnabled = false) finché la chiamata non ritorna con il file multimediale. Ho risolto proprio questo problema usando imagePickerController.

0

Ecco una versione Swift:

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.cameraIsReady), name: AVCaptureSessionDidStartRunningNotification, object: nil) 


func cameraIsReady(notification :NSNotification) { 
    print("Camera is ready...") 
} 
+0

È NSNotification.Name.AVCaptureSessionDidStartRunning ora :) – Nygashi