2013-08-18 8 views
41

Sto lavorando su una libreria per rendere l'API Camera più facile da utilizzare per gli sviluppatori.Idee di origine di QualcommCameraHardware native_get_picture: MSM_CAM_IOCTL_GET_PICTURE Errore di timeout della connessione?

Il Droid Incredible 2, in modalità verticale, utilizzando la fotocamera posteriore, non riesce a scattare una foto. In particolare, ho questa sequenza in LogCat:

08-18 09:25:52.094: E/QualcommCameraHardware(1368): native_get_picture: MSM_CAM_IOCTL_GET_PICTURE fd 25 error Connection timed out 
08-18 09:25:52.094: E/QualcommCameraHardware(1368): getPicture failed! 
08-18 09:25:52.094: E/QualcommCameraHardware(1368): get picture failed, giving jpeg callback with NULL data 

Questi messaggi si verificano ~ 5 secondi dopo che io chiamo takePicture() sul Camera, che si inserisce con qualche vecchio codice sorgente vedo per QualcommCameraHardware che imposta un timeout 5000ms sul ioctl() chiama per parlare all'hardware della videocamera.

Il risultato netto è che onPictureTaken() è passato a nullbyte[] di dati JPEG, ovvero non abbiamo alcuna foto.

Il dispositivo funziona con il mio codice in tutte le altre configurazioni testate, incluso il lavoro in modalità verticale con la fotocamera frontale.

Qualcuno sa qualcosa di specifico che potrebbe causare questo particolare errore?

UPDATE

non riesco più a riprodurre l'errore. Vorrei eliminare la domanda, ma a quanto pare non è possibile una volta che ci sono risposte.

+1

Hai provato a scattare foto a bassa risoluzione? –

+0

@AliImran: Darò una prova a volte, quando io e il mio Incredible 2 siamo nello stesso posto nello stesso momento. :-) Grazie! – CommonsWare

+0

@AliImran: la riduzione dell'output a una risoluzione più bassa sembrava davvero aiutare, anche se non ricevevo più questo particolare errore e invece ottenevo semplicemente un output danneggiato. Grazie! – CommonsWare

risposta

0

Molto probabilmente lo cameraService che fa parte del processo multimediale si è arrestato in modo anomalo in background. Se si tenta di eseguire l'app fotocamera predefinita in Android e non viene visualizzata, è sufficiente riavviare il dispositivo per disattivare questo errore.

Penso che si riutilizzi il callback di immagine per i callback sia raw che jpeg. Quindi, se è stato chiamato come callback non elaborato, i dati potrebbero essere nulli. Perché il documento dice,

Attiva un'immagine asincrona. Il servizio fotocamera avvierà una serie di richiamate all'applicazione mentre l'acquisizione dell'immagine avanza. La richiamata dell'otturatore si verifica dopo che l'immagine è stata catturata. Questo può essere usato per attivare un suono per far sapere all'utente che l'immagine è stata catturata. Il callback non elaborato si verifica quando sono disponibili i dati di immagine non elaborati (NOTA: i dati saranno nulli se non è disponibile un buffer di callback dell'immagine raw o il buffer di callback dell'immagine raw non è abbastanza grande da contenere l'immagine raw). Il callback postview si verifica quando è disponibile un'immagine postview in scala completamente elaborata (NOTA: non tutto l'hardware supporta questo). Il callback jpeg si verifica quando l'immagine compressa è disponibile. Se l'applicazione non ha bisogno di un particolare callback, può essere passato un null invece di un metodo di callback.

+0

"Penso che tu stia riutilizzando il callback delle immagini per i callback sia raw che jpeg" - Non sto fornendo un callback non formattato ('null'), e sto richiedendo un'immagine JPEG. – CommonsWare

1

MSM_CAM_IOCTL_GET_PICTURE è una chiamata del kernel che gestisce la funzione

static int msm_get_pic(struct msm_sync *sync, void __user *arg) 

ho scaricato il sorgente del kernel per il dispositivo dalla HTCDev e ho trovato la funzione definita in

drivers/media/video/msm/msm_camera-7x30.c 

potuto verificare che cosa sono i messaggi del kernel quando fai una foto?

adb shell su -c "dmesg" 
+0

... e ora non riesco a riprodurre il problema. Devo aver cambiato qualcosa nella mia app per qualche altro dispositivo, che ha avuto l'effetto collaterale di risolvere questo problema. Cancellerò la domanda in un giorno o due. Le mie scuse per aver perso tempo. – CommonsWare