2012-06-21 12 views
5

Oto interesująca ...orientacja na Androida - problemy z zamiarami (kamera)

Mam aplikację, którą piszę dla urządzeń z Androidem w wersji 2.3.3 i nowszych.

Ma główną aktywność, która wywołuje kamerę za pomocą intencji.

Jeśli użytkownik kliknie przycisk, aby uruchomić kamerę; następnie robi zdjęcie; następnie klika "Gotowe", aby powrócić do głównego działania - aplikacja działa poprawnie i wyświetla nowe zdjęcie w widoku obrazu głównego działania.

jeśli użytkownik użyje głównej czynności w orientacji pionowej; następnie klika przycisk, aby otworzyć cel kamery i zmienia orientację na poziomą; następnie kliknij Gotowe, aby powrócić do głównego działania - aplikacja ulega awarii, ale następnie ... jednak, jeśli użytkownik użyje głównej aktywności w orientacji pionowej; następnie klika przycisk, aby otworzyć cel kamery i zmienia orientację na poziomą; następnie zmienia orientację z powrotem na portret (w kamerze), zanim klikniesz Gotowe, aby powrócić do głównej aktywności - aplikacja będzie działać normalnie.

Rzeczy, które próbowałem: Zmieniłem plik manifestu, aby zmusić aplikację (główna aktywność) do orientacji w pionie (usunąłem to również). Dodałem tę linię do głównej aktywności, próbując obsługiwać przeformułowania aktywności na powrót z zamiarem kamery:

setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 

W oknie debugowania otrzymuję błędy opisując wyjątki NullPointer - Myślę, że to dlatego, że widoki są już tam po zmianie orientacji na obraz, który ma zostać przekazany, chyba że orientacja jest taka sama jak wtedy, gdy została.

Trochę utknąłem, więc docenię kilka rad.

+0

http://i56.tinypic.com/2iu97on.jpgh logcat katastrofy – max4ever

+0

http://stackoverflow.com/questions/14066038/why-image-captured-using-camera-intent-gets-rotated-on -some-devices-in-android –

Odpowiedz

3

Po zmianie orientacji ekranu Twój telefon Activity zostanie zniszczony i odtworzony w nowej orientacji. Więc wszystkie zmienne, które uzyskały referencje w czasie życia Activity, nie będą już niczego odnosić, a jeśli spróbujesz uzyskać dostęp do obiektów, do których się odnoszą, bez ponownego przypisywania ich wartości, dostaniesz NullPointerException.

Metoda onSaveInstanceState() służy do zapisywania danych tymczasowych między zmianami konfiguracji. Spowoduje to utworzenie pakietu, który zostanie przekazany do onCreate(), gdy Activity ponownie się uruchomi.

Bez żadnego kodu, nie wiem, czy to twój problem, ale warto go obejrzeć.

Aby uzyskać więcej informacji (i dokładniejszych informacji niż podałem, bez wątpienia).

+0

Dzięki za cynk. Podczas mojego dochodzenia znalazłem dwie awarie, z którymi miałem do czynienia. Pierwsza awaria została rozwiązana przez wstawienie tych dwóch metod do mojej głównej aktywności: – agrodude

1

hej nie jestem pewien, ale starają się umieścić tę właściwość w pliku manifestu nadzieją powinien działać

android:configChanges="orientation|keyboardHidden" 
+0

To prawdopodobnie zadziała, ale Google nie zaleca tego jako czegoś innego niż ostateczność - patrz http://developer.android.com/guide/topics/ resources/runtime-changes.html # HandlingTheChange – Spinner

+1

To też nie działa :( – NarendraJi

+0

@DroidWormNarendra powiedz mi, co dokładnie chcesz zrobić z miękką klawiaturą? –

0

Niektóre Android urządzeń takich jak Samsung S3 i S4 mają widok domyślny powierzchni aparatu w trybie poziomym. Po wywołaniu kamery i przechwyceniu obrazu i przejściu do aplikacji, niezależnie od tego, czy ustawiłeś orientację PORTRET, to najpierw otworzysz ją w trybie LANDSCAPE, a następnie zmienisz na tryb PORTRETOWY.

Jego zachowanie systemu operacyjnego Android. Z powodu tej aktywności ponownie tworzy ją samodzielnie. W tym czasie uzyskujesz wyjątek od wskaźnika zerowego. Możesz obsłużyć, ustawiając configChanges w pliku menifest.

android:configChanges="keyboard|keyboardHidden|screenLayout|screenSize|orientation" 

i można przechowywać dane tymczasowe w onSaveInstanceState() słusznie powiedziane przez @Spinner w swojej odpowiedzi.