7

Il problema che sto incontrando è che quando un utente scatta una foto con la nostra app, usando AVCaptureSession, non ho modo di determinare se hanno scattato la foto in modalità verticale o orizzontale. La nostra app supporta solo Portrait e tengo il blocco di orientamento attivo quando utilizzo il mio telefono, quindi sto cercando di costruire una soluzione ipotizzando che altri possano fare lo stesso.Come posso rilevare l'orientamento del dispositivo quando il blocco di orientamento è attivo e l'app supporta solo Portrait

Ho esaminato l'utilizzo di [UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications] ma quando il blocco di orientamento è attivo, non viene mai ricevuta alcuna notifica. So che questa funzionalità è possibile perché l'app di base Camera e la videocamera nell'app Hangouts di Google sono in grado di rilevare la rotazione (le animazioni sui pulsanti Annulla e Flash sono evidenti) quando sul mio telefono è attivo Blocco orientamento.

La soluzione migliore è utilizzare l'accelerometro e rilevare l'angolo di rotazione del telefono? Una vecchia risposta, Detect iPhone screen orientation, rende molto ovvio che il rilevamento dell'angolo in quel modo sia facile da fare (ovviamente adattando la risposta per utilizzare Core Motion anziché UIAccelerometer), ma sono curioso di sapere se esiste un altro modo per farlo.

risposta

1

Sì, è possibile farlo osservando i metadati dell'immagine. Non ho il tempo di scrivere una risposta dettagliata (mi dispiace per quello), ma l'ho fatto per il mio progetto da un po 'indietro attraverso CMCopyDictionaryOfAttachments(NULL, buffer, kCMAttachmentMode_ShouldPropagate); dove ho passato in un CMSampleBufferRef per il buffer. Ho ottenuto che buffer dalla

captureStillImageAsynchronouslyFromConnection:stillImageConnection completionHandler: ^(CMSampleBufferRef imageDataSampleBuffer, NSError *error){},

ma si può ottenere da

- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection pure.

È possibile trovare tutte le chiavi per quel dizionario here.

Effettuato un test rapido con l'app fotocamera predefinita con il blocco dell'orientamento attivato e ho ottenuto un orientamento diverso per le due immagini. 6 per il ritratto uno e 3 per il panorama.

Ancora una volta, mi piacerebbe darti maggiori dettagli su questo, ma sono sicuro che puoi capirlo guardando nei documenti.

+1

Grazie per l'avviso su CMCopyDictionaryOfAttachments, rende la lettura dei metadati molto più semplice. Usando 'captureStillImageAsynchronouslyFromConnection' sono ancora in grado di ottenere l'orientamento = 6. Ho abilitato le modalità Landscape sull'app, ma senza risultato. Ho intenzione di provarlo in un marchio per la nuova app per garantire che non ci sia un'impostazione strana nascosta da qualche parte che sta causando questo problema. – TheJer

+1

Supponendo di avere la connessione 'AVCaptureConnection *, stai impostando connection.videoOrientation ovunque? Indipendentemente da ciò che provo, i metadati restituiscono 6 per l'orientamento che ha senso perché l'impostazione predefinita di videoOrientation è 'AVCaptureVideoOrientationPortrait'. Il che mi riporta alla domanda iniziale su come rilevare la rotazione per modificare l'orientamento della cattura. – TheJer

+0

Sì, penso di ricordare di avere qualche problema anche con quello. Non ho il tempo di approfondire ora, sfortunatamente. Ma dovrebbe essere possibile, perché l'app per fotocamera predefinita lo fa, e non credo che abbiano avuto il problema di usare la loro API privata solo per quello. – vegather

Problemi correlati