2013-02-18 13 views
31

Ho un'app per fotocamere nel Google Play Store con Google Analytics installato. Continuo a ricevere il seguente rapporto incidente:Gestione corretta dell'eccezione: "getParameters non riuscito (parametri vuoti)"

getParameters fallito (parametri vuoti)

La mia domanda è: Qual è il modo corretto per gestire questa situazione?

Guardare nella fonte Android di dove accade non mi ha fornito dettagli extra. L'errore è gettato in android_hardware_Camera.cpp:

String8 params8 = camera->getParameters(); 
if (params8.isEmpty()) { 
    jniThrowRuntimeException(env, "getParameters failed (empty parameters)"); 
    return 0; 
} 

Guardando in open source Android macchina fotografica per vedere come gestisce la situazione era anche non molto disponibile. Questo codice non sembra catturare RuntimeException quando si chiama getParameters. (Tranne che in un caso in cui lo acchiappano, chiudi la fotocamera, quindi rilanciala).

C'è un modo corretto per gestire questo?

In caso contrario, c'è una ragione per cui questo accade così spesso?

Nota: In un dato giorno ho tra 5k - 8k utenti attivi. Con qualche tra 40-70 di queste eccezioni. Quello sembra davvero alto a me. So che ci sono casi legittimi in cui una telecamera potrebbe non riuscire a inizializzarsi. Ma l'1% degli utenti sembra irragionevole. Inoltre, poiché l'app per fotocamera Android non gestisce l'eccezione, mi chiedo se ci sia qualche altra causa alla radice.

+0

Mi chiedo se si trovare qualsiasi soluzione –

+1

+ onur taskin - Vedere la mia risposta qui sotto. Spiega come l'ho aggiustato, così come gli altri possono mettersi nei guai con esso. – Grimmace

+0

Nel mio caso, stavo ottenendo questo sull'app Camera Camera su un emulatore di API 22 Android. L'ho risolto utilizzando l'immagine del sistema operativo x86 a 32 bit sull'emulatore anziché quella a 64 bit x86. –

risposta

25

Come accennato + Eddy Talvala, ciò accade quando la fotocamera si trova in uno stato negativo.

In che modo la fotocamera si mette male?

1) Probabilmente il motivo più comune sarebbe chiudere/rilasciare la fotocamera mentre la si sta ancora utilizzando in seguito. Questo può essere particolarmente problematico se si utilizza l'oggetto Camera su più thread senza la sincronizzazione dell'accesso a Camera. Assicurati di avere sempre un solo thread per accedere allo Camera alla volta.

2) Nel mio caso è stato un po 'più complicato. Io uso un SurfaceTexture in modo che io possa usare l'output della fotocamera come trama OpenGL. In Android 4.0 (ICS), c'è un nuovo metodo SurfaceTexture.release(). Questo metodo è importante da utilizzare quando si utilizza SurfaceTexture s in quanto ripulisce la memoria più rapidamente rispetto a prima.

Il problema è che mi stava chiamando SurfaceTexture.release() mentre la fotocamera anteprima era ancora attivo. Si è verificato un arresto anomalo del servizio Camera, che ha causato il problema spiegato nella domanda.

Nel mio caso l'ho risolto ritardando la chiamata a SurfaceTexture.release() fino a dopo averlo sostituito con un nuovo SurfaceTexture. In questo modo ero certo che lo SurfaceTexture potesse essere ripulito senza effetti collaterali negativi.

+1

Ricordare che anche dopo aver risolto il problema, l'eccezione può ancora essere generata mentre il servizio della fotocamera può finire in cattivo stato. Se anche l'app Fotocamera del dispositivo non mostra un'immagine, solo un riavvio risolverà il problema. –

3

C'è un dispositivo Android specifico che presenta questo errore? O lo vedi su molti dispositivi.

In generale, non si dovrebbe vedere questo tipo di errore. È possibile che l'applicazione abbia una sorta di condizione di competizione che si traduce in questo, ma dovrebbe coinvolgere il tentativo di chiamare getParameters su una fotocamera non inizializzata o già rilasciata.

Potrebbe anche essere un errore nel codice della telecamera specifico del dispositivo o una condizione di gara rara da qualche parte nella pila di codici della telecamera. Senza ulteriori dettagli (bugcreate o bugreport di Android da un tale crash), è impossibile dire - l'errore stesso dice solo che il codice della telecamera specifico per il dispositivo ha restituito una serie vuota di parametri.

Ma una volta che si ottiene questo errore, non c'è molto che si possa fare - il sottosistema della telecamera è in qualche strano stato. Se vuoi provare ad affrontarlo, tutto quello che posso suggerire è chiudere e riaprire il dispositivo della fotocamera.

29

Nel mio caso mi è stato sempre questo errore:

getParameters fallito (parametri vuoti)

quando ho chiamato getParameters() dopo aver sbloccato la macchina fotografica. Quindi, per favore chiama getParameters() prima di chiamare camera.unlock().

1

oggetti telecamere sono sempre bloccate di default in modo che quando è possibile sbloccare il metodo poi si consente ad altri procceses di utilizzare i parametri in modo da assicurarsi che si ri bloccato la macchina fotografica prima di ottenere parametri

Problemi correlati