2017-10-27 48 views
18

Mam aktywność, która ma android:windowIsTranslucent ustawioną na true i android:windowBackground ustawioną na półprzezroczystym tłem. Właśnie zmienił się mój cel i skompilować wersję SDK do 27, a ja otrzymuję wyjątek podczas uruchamiania tej aktywności teraz:Orientacja ekranu blokady podczas kierowania na Androida API 27 z nieprzezroczystą aktywnością

java.lang.IllegalStateException: Only fullscreen opaque activities can request orientation

Ponieważ jest to nowy zestaw SDK, nie ma nic o tym jeszcze w Internecie (i wydaje się wynikać z tego wiersza kodu: https://android.googlesource.com/platform/frameworks/base.git/+/master/core/java/android/app/Activity.java#987)

Czy jest jakiś sposób obejścia tego? Aplikacja nie ulega awarii, jeśli wyjmę z tego manifestu z mojej manifestu android:screenOrientation="portrait", ale chciałabym móc to zachować.

+3

To nie ma sensu, aby móc wybrać orientację za pomocą przezroczystej aktywności. Co się stanie, jeśli Aktywność pod Tobą nie obsługuje tej aktywności, lub sama ją zablokujesz? Jak by to działało? Jeśli kiedykolwiek było to dozwolone, działało na luki prawnej. –

+0

Tak więc moim przypadkiem użycia jest to, że ta przezroczysta aktywność jest wyświetlana tylko w mojej aplikacji (nie jako nakładka na inną aplikację). Jest to działanie wyszukiwania, które nakłada się na moją główną działalność, główna aktywność nie zmienia się ani – vanshg

+2

Po pewnym eksperymentowaniu odkryłem, że po usunięciu atrybutu screenOrientation z podobnych półprzezroczystych aktywności moje działania ** nadal nie będą się obracać **, ponieważ te ** za nimi ** mają również atrybut screenOrientation z wartością ** portrait **. – sofakingforever

Odpowiedz

8

Też miałem do czynienia z tym samym problemem. Jak powiedzieli inni, Jeśli usunąłem android: screenOrientation = "portret" lub przesłoniłem go z android: screenOrientation = "nieokreślony", to wyjątek zniknął. Wygląda na to, że orientacja przedniej aktywności wynika z orientacji za aktywnością.

Myślałem o tym. Jeśli aktywność z przodu jest przezroczysta, a orientacja za aktywnością jest inna, to wyświetlacz staje się dziwny. Rozumiem więc, dlaczego ta logika sprawdzania została dodana. Zastanawiam się jednak, dlaczego ten problem nie wystąpił w Developer Preview 8.0.0.

+0

Zgadzam się z tą odpowiedzią - jednak zastanawiam się, dlaczego łamie tylko Oreo, ponieważ Oreo MR1 jest w porządku. – ShellDude

+0

miał półprzezroczystą aktywność na szczycie naszej głównej działalności. obie czynności zostały oznaczone jako "android: screenOrientation =" portrait ". Aplikacja zawiesiłaby się, gdyby system operacyjny Android 8.0 z interfejsem Target API 27. nie powodował problemów, gdy Target API 26 lub API 27 na Androidzie 8.1 lub 7. –

9

Obejście problemu polega na zmianie ustawienia targetSdk na 26.

Powodem, dla którego aplikacja ulega awarii, jest here w tym zatwierdzeniu.

Jak widać here, nie jesteś jedyny - to zachowanie zostało zgłoszone firmie Google jako problem. Zostało to naprawione, ale nie wiemy, jak i kiedy zostanie wydane.


Mogę również potwierdzić to, co „sofakingforever” mówi w komentarzach, jeśli jest działalność non-półprzezroczysty ze stałą orientacją za swoim półprzezroczysty, prześwitujący nie obraca się. Możesz też usunąć z manifestu także android:screenOrientation="portrait".

+0

To nie jest prawdziwe rozwiązanie. Jeśli ktoś kieruje reklamy na interfejs API 27, nie bez powodu. –

+1

@HarishVishwakarma Tak, masz absolutną rację. Zmieniłem słowo "rozwiązanie" na "obejście". I nie jest to na zawsze, ponieważ Google wymusi przesłanie nowego APK do GPlay w celu kierowania na najnowsze API. – JerabekJakub

0

Dzięki @JerabekJakub. Mój wynik testu - zachowaj sdk 27 ​​i usuń poniższe linie również może rozwiązać problem.

android:configChanges="orientation" 
android:screenOrientation="portrait" 
+0

powód usunięcia configChanges ?? –

+3

Ale spowoduje to obrót ekranu - coś, czego nie chcemy. – JerabekJakub

+0

Przetestowałem mój zgodnie z opisem JerabekJakub - jeśli nie jest przezroczysta aktywność o ustalonej orientacji za półprzezroczystych, półprzezroczyste nie będzie się obracać. – flame3

0

wydaje się, że to nowa funkcja/błąd w API 27. Można jednak usunąć android: screenOrientation Or androida: screenOrientation = "nieokreślony"

0

I rozwiązać te problemy poprzez zmianę tej linii w stylach NoActionBar

W docelowej wersji 27 tylko mam ten problem i rozwiązać za pomocą poniżej linii

<item name="android:windowIsTranslucent">false</item>