2013-04-22 7 views
13

Quindi, questa domanda è stata posta sotto molte forme su questo forum ma nessuna delle risposte mi sta aiutando. Ho un bug che sono stato in grado di riprodurre solo sul Samsung Galaxy S3.Galaxy S3 - scattare foto in modalità verticale distrugge l'attività

Desidero semplicemente scattare e memorizzare una foto utilizzando la fotocamera del telefono, ma la mia attività viene distrutta prima che io riesca a sentire su onActivityResult. Questo accade SOLO quando utilizzo la fotocamera in modalità verticale, in modalità orizzontale va bene.

sto usando questo codice per avviare la fotocamera:

Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); 
startActivityForResult(intent, Config.ACTIVITY_TAKE_PHOTO); 

in modalità verticale, non vedo mai una chiamata a onActivityResult (dall'attività Camera), vedo solo un OnDestroy() chiamato nel mio attività di lancio. Non ci sono eccezioni o errori nel log, e ovviamente non c'è nulla di sbagliato nel farlo andare in crash.

Ho visto post che consigliano di aggiungere "android: configChanges =" orientation | keyboardHidden "" al manifest e molte altre cose per gestire il cambiamento di orientamento che si verifica quando si utilizza la fotocamera, ma nulla ha aiutato in questo modo lontano.

Qualcun altro ha risolto questo problema?

+0

http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation(int). È possibile impostare l'orientamento del display. Ho una galassia s3 ho usato il codice sul sito dello sviluppatore. Non riesco a replicare il problema che stai affrontando. Tuttavia, ho affrontato un problema diverso, l'orientamento di dispaly era ritratto, l'immagine è stata catturata ma l'immagine salvata è stata ruotata. – Raghunandan

+0

Dovresti leggere questa discussione e anche capire che se vedi onDestroy(), Android non ha ucciso il tuo processo. Qualcos'altro. Si prega di leggere e assorbire la documentazione del ciclo di vita dell'Attività e anche rendersi conto che 'android: configChanges =" orientation | keyboardHidden' è un hack che nasconde molti peccati (bug) a meno che tu non lo comprenda veramente https://groups.google. com/forum /? fromgroups = #! topic/piattaforma android/x72BabVtWcQ – Simon

+0

Simon, hai qualche consiglio su come ottenere maggiori informazioni su onDestroy() della mia attività? C'è qualcosa che posso fare per stampare un altro traccia stack dettagliata che porta ad esso? – TomBomb

risposta

1

Android può chiamare il metodo destroy() in determinati scenari. Uno è quando usiamo il metodo finish(). Un'alternativa è usare il metodo isFinishing() dalla classe Activity. Se in realtà è in fase di ultimazione potrebbe finalizzare le proprie risorse, in caso contrario, è possibile mantenere i valori assegnati una classe che eredita Applicazione

@Override 
protected void onDestroy() { 

    final YourApp app = (YourApp) getApplicationContext(); 
    if (app != null && isFinishing()) { 
     app.finalizeAppResources(); 
    } 

    // ... 

    super.onDestroy(); 
} 
18

Se si prendono di mira oltre il livello di API 13, Aggiunta

android:configChanges="orientation|keyboardHidden" 

al Manifesto non sarà sufficiente.

controllare questo estratto da Android documentation

Nota: Se i vostri obiettivi di applicazioni di livello API 13 o superiore (come dichiarato dal minSdkVersion e gli attributi targetSdkVersion), allora si dovrebbe anche dichiarare la configurazione "Screensize", perché cambia anche quando un dispositivo cambia tra orientamento verticale e orizzontale.

Quindi provare l'aggiunta di

android:configChanges="orientation|keyboardHidden|screenSize" 

al file manifesto. Questo dovrebbe risolvere il tuo problema.

+0

Questo è stato molto utile per me – adrian4aes

+0

@dishan Capisco l'orientamento e il flag screenSize qui, ma perché keyboardHidden? –

+0

@TashPemhiwa Sì per questa particolare domanda 'keyboardHidden' potrebbe non avere alcun effetto. Quindi 'android: configChanges =" orientation | screenSize "' dovrebbe funzionare anche. Ma ancora una volta l'inclusione di 'keyboardHidden' fornirà una protezione extra perché impedisce il riavvio dell'attività anche su un evento di modifica della disponibilità della tastiera. 'orientation' e' keyboardHidden' sono le modifiche di configurazione più comunemente usate in Android che le persone vogliono gestire autonomamente senza riavviare l'attività. Quindi avendo 'keyboardHidden' ci sarà una cosa saggia da fare. – dishan