2013-04-22 12 views
13

To pytanie zostało zadane w wielu postaciach na tym forum, ale żadna z odpowiedzi mi nie pomaga. Mam błąd, który udało mi się odtworzyć tylko na Samsung Galaxy S3.Galaxy S3 - zrobienie zdjęcia w trybie portretowym niszczy aktywność

Chcę po prostu zrobić i zapisać zdjęcie za pomocą aparatu w telefonie, ale moja Aktywność jest niszczona, zanim usłyszę z powrotem od funkcji onActivityResult. Dzieje się to TYLKO w przypadku korzystania z aparatu w trybie portretu, w trybie poziomym jest w porządku.

używam tego kodu, aby uruchomić kamerę:

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

W trybie portretu, nie widzę wezwanie do onActivityResult (od aktywności Camera), po prostu zobaczyć onDestroy(), zwany w moim uruchamianie działalności. W dzienniku nie ma żadnych wyjątków ani błędów, a także oczywiste, że nie powodują one awarii.

Widziałem posty, które zalecają dodanie do manifestu "android: configChanges =" orientacja | klawiaturaUkryj "i wiele innych rzeczy do zarządzania zmianą orientacji, która występuje podczas korzystania z aparatu, ale nic nie pomogło daleko.

Czy ktoś jeszcze rozwiązał ten problem?

+0

http://developer.android.com/reference/android/hardware/Camera.html#setDisplayOrientation). Możesz ustawić orientację ekranu. Mam galę s3 i użyłem kodu na stronie programisty. Nie mogę zreplikować problemu, przed którym stoisz. Jednak miałem inny problem, orientacja była orientacyjna, zdjęcie zostało zrobione, ale zapisane zdjęcie zostało obrócone. – Raghunandan

+0

Powinieneś przeczytać tę dyskusję, a także zdać sobie sprawę, że jeśli zobaczysz naDestroy(), Android nie zabił twojego procesu. Coś innego zrobiło. Proszę przeczytać i pochłonąć dokumentację dotyczącą cyklu życia w działaniu, a także zdać sobie sprawę, że "android: configChanges =" orientation | keyboardHidden' to hack, który ukrywa wiele grzechów (błędów), chyba że naprawdę go rozumiesz. Https://groups.google. com/forum /? fromgroups = #! topic/android-platform/x72BabVtWcQ – Simon

+0

Simon, czy masz porady, jak uzyskać więcej informacji na temat mojej działalności onDestroy() mojej działalności? Czy jest coś, co mogę zrobić, aby wydrukować więcej szczegółowy ślad stosu prowadzący do niego? – TomBomb

Odpowiedz

1

Android może wywołać metodę destroy() w niektórych scenariuszach. Jednym z nich jest użycie metody finish(). Alternatywą jest użycie metody isFinishing() z klasy Activity. Jeśli to naprawdę jest na ukończeniu mógł sfinalizować swoje zasoby, w przeciwnym razie można zachować wartości przypisane klasę, która dziedziczy aplikacja

@Override 
protected void onDestroy() { 

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

    // ... 

    super.onDestroy(); 
} 
18

Jeśli są kierowane poza poziom API 13, Dodawanie

android:configChanges="orientation|keyboardHidden" 

do Manifestu nie wystarczy.

Sprawdź to wyciąg z Android documentation

Uwaga: Jeśli cele aplikacyjne poziom API 13 lub wyższy (deklarowany przez minSdkVersion i atrybuty targetSdkVersion), to należy również zadeklarować konfiguracji „Rozmiar ekranu”, gdyż zmienia się także, gdy urządzenie przełącza się między orientacją pionową i poziomą.

Stąd warto dodać

android:configChanges="orientation|keyboardHidden|screenSize" 

do pliku manifestu. To powinno rozwiązać twój problem.

+0

To było bardzo przydatne dla mnie – adrian4aes

+0

@dishan Rozumiem tutaj orientację i flagę screenSize, ale dlaczego keyboardHidden? –

+0

@TashPemhiwa Tak dla tego konkretnego pytania 'keyboardHidden' może nie mieć żadnego efektu. Zatem również 'android: configChanges =" orientation | screenSize "' powinno również działać. Ale ponowne włączenie klawisza 'keyboardHidden' zapewni dodatkową ochronę, ponieważ zapobiega ponownemu uruchomieniu aktywności w przypadku zmiany dostępności klawiatury. "orientation" i "keyboardHidden" to najczęściej używane zmiany konfiguracji w systemie Android, które ludzie chcą sobie poradzić bez restartowania działania. Zatem posiadanie 'keyboardHidden' będzie mądre. – dishan

Powiązane problemy