Android aktywuje tryb zgodności w przypadku aplikacji, które deklarują ograniczenia dotyczące orientacji lub możliwości zmiany rozmiaru. Tryb zgodności zapewnia akceptowalne działanie aplikacji na urządzeniach z dużym ekranem i składanych telefonach z klapką, ale z mniejszą funkcjonalnością.
Zastąpienia na poziomie aplikacji umożliwiają producentom urządzeń, właścicielom urządzeń wirtualnych1 i użytkownikom zmianę działania aplikacji w celu ulepszenia jej układu lub zapobiegania jej uszkodzeniu na wybranych urządzeniach.
Android 16
Android 16 (poziom API 36) ignoruje orientację ekranu, proporcje i ograniczenia dotyczące zmiany rozmiaru aplikacji, aby poprawić układ aplikacji na formatach o szerokości >= 600 dp.
W przypadku aplikacji kierowanych na interfejs API na poziomie 36 następujące zastąpienia na poziomie aplikacji są niefunkcjonalne:
- FORCE_RESIZE_APP
- FORCE_NON_RESIZE_APP
- OVERRIDE_MIN_ASPECT_RATIO
- OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
- OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
- OVERRIDE_MIN_ASPECT_RATIO_LARGE
- OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
- OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
- OVERRIDE_ANY_ORIENTATION
- OVERRIDE_ANY_ORIENTATION_TO_USER
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
- OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
- OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
- OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
- OVERRIDE_RESPECT_REQUESTED_ORIENTATION
Zrezygnuj
Aplikacja może być kierowana na interfejs API na poziomie 36, ale nie korzystać z zachowania Androida 16. W takim przypadku parametr OVERRIDE_ANY_ORIENTATION_TO_USER nie ma zastosowania.
Deklarowanie właściwości pliku manifestu
Aby zrezygnować z zachowania na poziomie API 36, zadeklaruj właściwość pliku manifestu PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY
.
Aby zrezygnować z określonej aktywności, ustaw odpowiednią właściwość w elemencie <activity>
:
<activity ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</activity>
Aby zrezygnować z usług w całej aplikacji, ustaw odpowiednią usługę w elemencie <application>
:
<application ...>
<property
android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
android:value="true" />
...
</application>
Urządzenia referencyjne
Na tych urządzeniach może być konieczne zastosowanie ustawień zastępczych dla poszczególnych aplikacji z powodu nietypowych konfiguracji lub konfiguracji, które nie są dobrze obsługiwane przez aplikacje:
- Tablety: domyślna orientacja niektórych tabletów, takich jak Pixel Tablet, to orientacja pozioma. Urządzenie jest w naturalnej orientacji, gdy
Display#getRotation()
wraca doSurface.ROTATION_0
. Jeśli aplikacje zakładają, żeROTATION_0
to orientacja pionowa, układy aplikacji i podgląd aparatu mogą nie pasować do ekranu urządzenia. - Składane urządzenia w orientacji poziomej: niektóre składane urządzenia, takie jak Pixel Fold, mają orientację pionową w sposobie zwykłego urządzenia, ale w orientacji poziomej po rozłożeniu. Jeśli aplikacje zakładają, że rozłożony ekran ma orientację pionową, mogą wystąpić problemy z migotaniem lub pętlami.
- Składane telefony: w rozłożonej formie mają one zwykle orientację pionową. Jednak po złożeniu telefony zwykle mają mały ekran w orientacji poziomej. Aplikacje muszą wykrywać różne orientacje wyświetlacza i stosować się do nich.
- Wyświetlacze zewnętrzne: wybrane urządzenia mogą rozpocząć sesję okna pulpitu na zewnętrznych wyświetlaczach. Aplikacje muszą wysyłać zapytania do wyświetlaczy zewnętrznych w celu uzyskania informacji, takich jak rozmiar i rozdzielczość ekranu. W przeciwnym razie mogą one robić błędne założenia dotyczące wyświetlaczy, co może prowadzić do nieprawidłowego działania aplikacji.
- Wyświetlacze samochodowe: wiele, ale nie wszystkie wyświetlacze samochodowe są w orientacji poziomej. Tworzenie zaparkowanych aplikacji na wyświetlacze samochodowe jest podobne do tworzenia aplikacji na tablety.
Typowe problemy ze zgodnością
Najczęstszą przyczyną problemów z kompatybilnością aplikacji są ograniczenia dotyczące orientacji, możliwość zmiany rozmiaru i ograniczenia dotyczące proporcji, nieprawidłowe obsługiwanie orientacji podglądu aparatu oraz niewłaściwe używanie interfejsów API.
Letterboxing
W trybie Letterbox aplikacja jest umieszczona na środku ekranu lub, w przypadku dużych ekranów, na jednej z boków, aby zapewnić wygodny dostęp. Nieużywane obszary wyświetlacza po bokach lub u góry i dołu aplikacji wypełniają maty (kolorowe paski lub zamazane tapety).
Letterboxowanie często występuje na urządzeniach z dużym ekranem, ponieważ wymiary i format obrazu na wyświetlaczu różnią się od tych na standardowych telefonach, na które przeznaczona jest większość aplikacji.

Rysunek 1. Aplikacja ograniczona do orientacji pionowej jest wyświetlana w formacie letterbox na tabletach i urządzeniach składanych w orientacji poziomej.
Problem
Aplikacja nie obsługuje wszystkich konfiguracji wyświetlania, ponieważ ma stałą orientację, stały współczynnik proporcji lub nie można jej skalować.
Ustawienia konfiguracji, które kontrolują orientację i możliwość zmiany rozmiaru aplikacji:
screenOrientation
: określa stałą orientację aplikacji. Aplikacje mogą też ustawiać orientację w czasie działania za pomocą elementuActivity#setRequestedOrientation()
.resizeableActivity
: wskazuje, czy system może zmieniać rozmiary aplikacji, aby pasowały one do okien o różnych wymiarach. W Androidzie 11 (poziom interfejsu API 30) lub starszym określa, czy aplikacje obsługują tryb wielookienkowy. W przypadku Androida 12 (poziom API 31) lub nowszego określa, czy aplikacje obsługują tryb wielookienkowy na małych ekranach (klasa rozmiaru okna). W systemie Android 12 i nowszych aplikacje obsługują tryb wielu okien na dużych ekranach (klasa rozmiaru okna średniego lub rozszerzonego) niezależnie od tego ustawienia.maxAspectRatio
: określa maksymalny współczynnik proporcji obsługiwany przez aplikację. UstawieniemaxAspectRatio
mogą zmienić tylko aplikacje, w których parametrzeresizeableActivity
jest ustawiona wartośćfalse
.minAspectRatio
: określa minimalny format obrazu obsługiwany przez aplikację. WartośćminAspectRatio
mogą ustawić tylko aplikacje, w których parametrzeresizeableActivity
jest ustawiona wartośćfalse
.

Aplikacja ograniczona do orientacji pionowej, nieużyteczna na urządzeniu w orientacji poziomej.
Optymalizacja
Aplikacja powinna obsługiwać wszystkie orientacje i rozmiary wyświetlacza oraz tryb wielookienności. Usuń wszystkie ograniczenia dotyczące orientacji i ustawionego formatu obrazu z pliku manifestu i schematów aplikacji.

Aplikacja obsługuje wszystkie orientacje urządzenia.
Sposób obejścia problemu z kompatybilnością
Jeśli aplikacja o ustawionej orientacji lub ustalonym współczynniku proporcji działa w oknie, które nie obsługuje bezpośrednio rozmiaru lub orientacji okna, Android wpisuje aplikację w ramkę, aby zachować ciągłość.
Począwszy od Androida 12 (poziom API 31) i później 12L (poziom API 32), platforma wprowadza różne ulepszenia w aplikacji w formacie letterbox. Producenci urządzeń implementują ulepszenia interfejsu. Aby skorzystać z tych ulepszeń, nie musisz nic robić w swojej aplikacji.
Android 12 (poziom interfejsu API 31) wprowadza te ulepszenia estetyczne, które mogą być konfigurowane przez producentów urządzeń:
- Zaokrąglone rogi: rogi okna aplikacji mają bardziej wyrafinowany wygląd.
- Przezroczystość paska systemu: paski stanu i paski nawigacyjne, które nakładają się na aplikację, są półprzezroczyste, dzięki czemu ikony na paskach są zawsze widoczne na tle letterbox.
- Format obrazu: format obrazu aplikacji można dostosować, aby poprawić jej wygląd.

Rysunek 2. Aplikacja w formacie letterbox z ulepszeniami interfejsu.
12L (poziom interfejsu API 32) wprowadza te ulepszenia funkcjonalności:
Możliwość konfiguracji położenia: na dużych ekranach producenci urządzeń mogą umieszczać aplikację po lewej lub prawej stronie wyświetlacza, co ułatwia interakcję.
Zmieniony przycisk ponownego uruchamiania: producenci urządzeń mogą zmienić wygląd przycisku ponownego uruchamiania w trybie zgodności z rozmiarem, aby ułatwić użytkownikom jego rozpoznawanie.
Android 13 (poziom API 33) zawiera okno z informacjami dla użytkownika na temat umieszczania aplikacji w ramce na ekranie lub włączania ramki w trybie podzielonego ekranu:

Rysunek 3. Aplikacja w formacie letterbox z oknem z informacjami dla użytkowników
Tryb zgodności rozmiaru
Tryb zgodności z rozmiarem to letterbox, który zachowuje proporcje aplikacji i zawiera opcję ponownego uruchamiania. Użytkownicy mogą z jego pomocą ponownie uruchomić aplikację i odświeżyć wyświetlacz. Android wywołuje tryb zgodności z rozmiarem w przypadku aplikacji, których rozmiaru nie można zmienić. Gdy aktywność zostanie przeniesiona do kontenera wyświetlania, który jest niezgodny z jej wymiarami, system może zmienić rozmiar aplikacji, aby wypełniła ona ekran urządzenia co najmniej w jednym wymiarze.
Zmiany konfiguracji urządzenia, które mogą spowodować uruchomienie trybu zgodności z rozmiarem:
- Obracanie urządzenia
- Składanie i rozkładanie składanego urządzenia
- Przełączanie się między trybami wyświetlania pełnego ekranu i podzielonego ekranu
Problem
Tryb zgodności z rozmiarami jest zwykle stosowany w przypadku aktywności, które są ograniczone pod względem orientacji lub proporcji, a także skonfigurowane (lub określone przez system) tak, aby nie można było ich zmieniać.
Aplikacja jest uznawana za umożliwiającą zmianę rozmiaru i nie zostanie umieszczona w trybie zgodności z rozmiarem, jeśli spełnia co najmniej 1 z tych kryteriów:
- można zmienić rozmiar za pomocą
resizeableActivity="true"
, - Obsługa trybu obrazu w obrazie (PIP)
- jest umieszczony,
- czy producent urządzenia zastosował zastąpienie dla aplikacji
FORCE_RESIZE_APP
(właściwości ustawione przez aplikację są ignorowane);
Jeśli Twoja aplikacja nie spełnia żadne z tych warunków, jest uważana za nierozmiarową i może zostać umieszczona w trybie zgodności rozmiarów.

Aplikacja bez możliwości zmiany rozmiaru ulega awarii w trybie wielu okien.
Optymalizacja
Aplikacja powinna obsługiwać wszystkie rozmiary wyświetlania. Aby umożliwić zmianę rozmiaru aplikacji, w manifeście aplikacji ustaw atrybut android:resizeableActivity
elementu <activity>
lub <application>
na true
. Zaprojektuj układy elastyczne lub adaptacyjne dla swojej aplikacji. Więcej informacji znajdziesz w artykułach Obsługa różnych rozmiarów wyświetlacza i Obsługa trybu wielookiennego.

Aplikacja działa we wszystkich rozmiarach okien.
Sposób obejścia problemu z kompatybilnością
Android umieszcza aplikację w trybie zgodności z rozmiarem, gdy system stwierdzi, że wyświetlanie aplikacji w letterboxie można ulepszyć, zmieniając jej rozmiar, aby wypełnić okno wyświetlania w co najmniej 1 wymiarze. System wyświetla opcję ponownego uruchamiania, która ponownie tworzy proces aplikacji, ponownie tworzy aktywność i ponownie rysuje wyświetlacz. Zobacz też omówienie procesów i wątków.

Aplikacja w orientacji pionowej w ramce w orientacji poziomej, pomniejszona przez element sterujący ponownym uruchamianiem.
migające pętle,
Jeśli aplikacja nie obsługuje wszystkich orientacji wyświetlania, może wielokrotnie prosić o nowe orientacje, gdy nastąpi zmiana konfiguracji, co spowoduje nieskończony cykl, który spowoduje migotanie wyświetlacza lub niekończące się obracanie aplikacji.
Problem
W Androidzie 12 (API na poziomie 31) i nowszych producenci urządzeń mogą skonfigurować swoje urządzenia tak, aby ignorowały ograniczenia dotyczące orientacji określone przez aplikacje, a zamiast tego wymuszać tryby zgodności. Na przykład urządzenie składane może zignorować ustawienie android:screenOrientation="portrait"
aktywności, gdy jest ona wyświetlana na wewnętrznym ekranie w układzie poziomym o rozmiarze tabletu.
Jeśli ograniczenia orientacji aplikacji są ignorowane, aplikacja może ustawiać orientację programowo, wywołując funkcję Activity#setRequestedOrientation()
. Jeśli aplikacja nie obsługuje zmian konfiguracji (patrz Obsługa zmian konfiguracji), wywołanie powoduje jej ponowne uruchomienie. Po ponownym uruchomieniu aplikacja ponownie ignoruje ograniczenia orientacji, powtarza wywołanie funkcji setRequestedOrientation()
, co powoduje ponowne uruchamianie aplikacji, i tak dalej w nieskończoności.
Może się to też zdarzyć, gdy naturalna orientacja (czyli zwykła, jak określa Android) ekranu urządzenia jest pozioma (czyli wywołanieDisplay#getRotation()
zwracaSurface.ROTATION_0
, gdy urządzenie ma format obrazu poziomego). Do tej pory aplikacje zakładały, że Display.getRotation() =
Surface.ROTATION_0
oznacza, że urządzenie jest w orientacji pionowej, ale nie zawsze tak jest, np. na ekranie wewnętrznym niektórych składanych urządzeń i na niektórych tabletach.
Aplikacja w orientacji poziomej na składanym ekranie wewnętrznym może sprawdzić obrót ekranu, otrzymać wartość ROTATION_0
, przyjąć, że naturalną orientacją urządzenia jest orientacja pionowa, i wywołać funkcję setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
, aby zmienić układ aplikacji. Po ponownym uruchomieniu aplikacji (w orientacji poziomej) może ona ponownie sprawdzić obrót ekranu, otrzymać wartość ROTATION_0
, wywołać funkcję setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
i kontynuować nieskończony cykl.

Aplikacja przeznaczona tylko do wyświetlania w orientacji poziomej, gdy wyświetlacz jest w orientacji pionowej, wielokrotnie wywołuje funkcję Activity#setRequestedOrientation()
.
Optymalizacja
Aplikacje nie mogą:
- Ustaw domyślny kierunek za pomocą
Activity#setRequestedOrientation()
w metodzie activityonCreate()
, ponieważ prośba o kierunek może zostać nieoczekiwanie wywołana przez nieobsługiwane zmiany konfiguracji. - Zakładamy, że naturalna orientacja urządzenia (
ROTATION_0
) to orientacja pionowa - Ustaw orientację na podstawie sygnałów niezwiązanych z obecnym rozmiarem okna, takich jak
Display#getRotation()
, obecnośćFoldingFeature
lub wycofane interfejsy API.

Aplikacja obsługuje zmianę konfiguracji, nie ma ograniczeń orientacji, więc nie wchodzi w pętlę migotania.
Sposób obejścia problemu z kompatybilnością
Android ignoruje wywołania funkcji Activity#setRequestedOrientation()
w tych sytuacjach:
Aktywność została już ponownie uruchomiona po poprzednim wywołaniu metody lub włączono wymuszanie obracania obrazu w ramach obsługi kamery (patrz Podgląd kamery poniżej).
Producenci urządzeń mogą zastosować to zachowanie w przypadku aplikacji z
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
.Aktywność wysłała w ciągu 1 sekundy więcej niż 2 żądania orientacji, co wskazuje na wystąpienie pętli. Z 2 żądań w pętli Android używa tego, które maksymalizuje obszar wyświetlania aplikacji.
Producenci urządzeń mogą zastosować to zachowanie w przypadku aplikacji z
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
.Właściciele urządzeń wirtualnych zastąpili wywołanie metody na wybranych urządzeniach.
Podgląd z aparatu
Podgląd aparatu (lub wizjer) w aplikacjach aparatu może być zniekształcony lub nieprawidłowo wyrównany na tabletach, laptopach i ekranach składanych.
Problem
Dokument z definicją zgodności Androida stwierdza, że czujnik obrazu aparatu „MUSI być ustawiony tak, aby dłuższy wymiar aparatu był zgodny z dłuższym wymiarem ekranu”.
Aplikacje często zakładają, że orientacja urządzenia i czujnika aparatu jest pionowa – jest to rozsądne założenie w przypadku standardowych telefonów komórkowych. Jednak naturalna orientacja tabletów i laptopów oraz ich czujników aparatu może być pozioma. Nowe formaty, takie jak składane urządzenia, mogą mieć wiele naturalnych orientacji i wiele czujników aparatu w różnych orientacjach.
Rozpoczynanie aktywności z orientacją aparatu, której aplikacja nie obsługuje, lub przełączanie się między różnymi kamerami lub ekranami urządzenia (w przypadku składanych urządzeń) może spowodować przesunięcie lub zniekształcenie podglądu aparatu.

Zła pozycja i zniekształcenie podglądu aparatu na składanym urządzeniu z dużym ekranem
Optymalizacja
Aplikacje do obsługi aparatu muszą prawidłowo rozpoznawać i zarządzać orientacją urządzenia oraz orientacją czujnika aparatu, aby wyświetlać prawidłowo wyrównany i przeskalowany podgląd aparatu. Aplikacje muszą obliczyć obrót urządzenia, obrót czujnika oraz współczynnik proporcji ekranu lub okna, a następnie zastosować wyniki w podglądzie aparatu. Szczegółowe wskazówki znajdziesz w artykułach Podgląd z aparatu i Wprowadzenie do korzystania z celownika kamery.

Podgląd aparatu jest prawidłowo wyrównany i powiększony we wszystkich orientacjach urządzenia.
Sposób obejścia problemu z kompatybilnością
Urządzenie jest w naturalnej orientacji, gdy Display#getRotation()
zwraca Surface.ROTATION_0
. System oblicza CameraCharacteristics.SENSOR_ORIENTATION
na podstawie naturalnej orientacji urządzenia. Android dopasowuje okno pionowe aplikacji z ograniczeniami do naturalnej orientacji urządzenia, co jest wymagane przez większość aplikacji. Android przycina też obraz z czujnika aparatu, gdy orientacja czujnika jest pozioma, a podgląd aparatu – pionowa. Do tych obejść można zaliczyć:
Wymuszanie obracania podglądów aparatu w przypadku aplikacji ograniczonych do orientacji pionowej: aplikacje ograniczone do orientacji pionowej oczekują, że naturalna orientacja urządzenia i orientacja czujnika aparatu będą pionowe. W Androidzie 12 (poziom interfejsu API 31) i nowszych aplikacje mogą działać w różnych orientacjach, jeśli producenci urządzeń ignorują specyfikację orientacji.
Gdy aplikacja z ograniczeniami dotyczącymi orientacji pionowej połączy się z aparatem, Android wymusi jej obrócenie, aby dopasować okno aplikacji do naturalnej orientacji urządzenia.
Na niektórych tabletach (patrz urządzenia referencyjne) okno aplikacji w orientacji pionowej jest obracane do pełnego ekranu w orientacji pionowej, aby dopasować je do naturalnej orientacji urządzenia. Aplikacja zajmuje cały ekran po wymuszeniu jego obrócenia.
Tablet – wymuszenie obracania aplikacji ograniczonej do orientacji pionowej.
Na wewnętrznym ekranie w orientacji poziomej składanych urządzeń (patrz urządzenia referencyjne) aktywności przeznaczone tylko do trybu poziomego są obracane w poziom, aby dopasować je do naturalnej orientacji po rozłożeniu. Aplikacja jest wyświetlana w ramce po przymusowej zmianie orientacji.
składany – wymuszenie obracania aplikacji ograniczonej do orientacji pionowej. Aplikacja jest też letterboxowana.
Przycinanie wewnętrznego aparatu przedniego: w przypadku niektórych składanych urządzeń czujnik wewnętrznego aparatu przedniego jest w orientacji poziomej. Oprócz wymuszenia obracania podglądu aparatu na składanym wyświetlaczu wewnętrznym Android przycina pole widzenia wewnętrznego aparatu przedniego (w orientacji poziomej), aby czujnik rejestrował obraz przeciwny do orientacji urządzenia.
Wymuś odświeżanie podglądu kamery: po wymuszonej rotacji system przechodzi przez metody aktywności
onStop()
ionStart()
(domyślnie) lubonPause()
ionResume()
(zastosowane przez zastąpienie OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE na poziomie aplikacji), aby upewnić się, że podgląd kamery jest prawidłowo wyświetlany.Skalowanie formatu obrazu: system dynamicznie zmienia format obrazu wymuszonego obrotu kamery na większy minimalny format obrazu, co zapewnia prawidłowe skalowanie podglądu kamery.
Deweloperzy aplikacji mogą zignorować te obejścia, jeśli ich aplikacje obsługują podgląd aparatu. Zobacz zastąpienia na poziomie aplikacji.
Interfejsy API, których użytkownicy często nadużywają
Ponieważ Android obsługuje teraz takie funkcje jak tryb wielozadaniowości i urządzenia składane, wycofane zostały starsze interfejsy API i zastąpione nowszymi, które działają na wszystkich rozmiarach ekranów i w różnych formach urządzeń. Wycofane interfejsy API są jednak nadal dostępne ze względu na zgodność wsteczną.
Niektóre interfejsy API View
są przeznaczone do specjalnych celów, które nie zawsze są dobrze rozumiane przez programistów.
Problem
Deweloperzy nadal używają wycofanych interfejsów API Display
i nieprawidłowo zakładają, że interfejsy te zwracają granice aplikacji zamiast granic obszaru wyświetlania urządzenia. Może też być tak, że deweloperzy używają interfejsów API widoku do celów specjalnych, aby uzyskać ogólne dane wyświetlania.
W efekcie po zmianie rozmiaru okna aplikacji dochodzi do błędów w przemieszczaniu elementów interfejsu, co powoduje problemy z układem.
Wycofane i często niewłaściwie używane interfejsy Display API:
Więcej informacji znajdziesz w artykule Obsługa trybu wielookiennego.
Nieprawidłowe użycie interfejsów API widoku:

Wycofany interfejs API błędnie oblicza granice aplikacji. Treści aplikacji znikają z ekranu.
Optymalizacja
Nigdy nie licz na to, że rozmiar ekranu będzie wystarczający do pozycjonowania elementów interfejsu. Przeprowadź migrację aplikacji na interfejsy API oparte na WindowMetrics
, w tym na te interfejsy WindowManager
:
Platforma:
Jetpack:

Interfejs API poprawnie oblicza dane okna aplikacji.
Sposób obejścia problemu z kompatybilnością
2 zastąpienia dostosowują przestarzałe interfejsy API Display
i niewłaściwie używane interfejsy API View
, aby zwracać granice aplikacji:
ALWAYS_SANDBOX_DISPLAY_APIS
dla interfejsów API Display
;
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
dla interfejsów API View
. ALWAYS_SANDBOX_DISPLAY_APIS
jest też domyślnie stosowany w przypadku aplikacji, które kwalifikują się do trybu zgodności z rozmiarem.
przejrzyste działania,
Przezroczyste działania są wynikiem przezroczystych stylów tła, na przykład:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Tematy związane z dialogami, takie jak Theme.MaterialComponents.Dialog
, mogą zawierać style, które czynią działania przejrzystymi.
Aktywności przezroczyste nie obejmują całej dostępnej przestrzeni wyświetlania, co utrudnia ich zarządzanie, ponieważ dostępna powierzchnia wyświetlania może się zmieniać w zależności od zmian konfiguracji, takich jak obracanie urządzenia, składanie i rozkładanie urządzenia oraz tryb wielookienkowy.
Problem
Przeźroczysta aktywność powinna być zgodna z granicami pierwszej nieprzezroczystej aktywności poniżej niej w stosie działań zadania. Jednak nieprzejrzysta aktywność, która uruchamia okno z prośbą o przyzwolenie, może być trampoline (czyli aktywnością, która uruchamia inną aktywność, a potem znika). W związku z tym system nie może określić granic aktywności trampoline, która uruchomiła przejrzystą aktywność z oknem z prośbą o przyzwolenie.

Dialog został nieprawidłowo umieszczony, ponieważ aktywność została uruchomiona z trampoliny.
Optymalizacja
Aktywności przejrzyste dziedziczą ograniczenia od najbardziej nieprzezroczystej aktywności znajdującej się poniżej nich w grupie aktywności zadania. Aktywność nieprzejrzysta musi być dostępna przez cały cykl życia aktywności przejrzystej, od jej utworzenia do usunięcia. Z tego powodu nie uruchamiaj prośby o uprawnienia z trampoline.
Jeśli aktywność trampoliny uruchamia prośbę o przyznanie uprawnień, użytkownik może nie widzieć okna dialogowego z prośbą o przyznanie uprawnień, ponieważ aktywność trampoliny zostanie zniszczona, zanim użytkownik zdąży odpowiedzieć na prośbę, a wymiary i położenie aktywności okna dialogowego mogą zostać obliczone niepoprawnie.
Aplikacje powinny zawsze wysyłać prośby o uprawnienia z działań, które pozostają widoczne, dopóki użytkownik nie podejmie decyzji.
Zaokrąglone narożniki
Aktywność może być przezroczysta, ponieważ styl określa przezroczystość tła lub dlatego, że zawartość aktywności nie wypełnia dostępnej przestrzeni wyświetlania. Jeśli przezroczysta aktywność wypełnia dostępną przestrzeń na ekranie, system automatycznie zaokrągla rogi tej aktywności, jeśli producent urządzenia skonfigurował ją w ten sposób. Jeśli jednak przezroczysta czynność (np. okno z prośbą o zgodę) nie wypełnia dostępnej przestrzeni, to od Ciebie zależy, czy zastosować zaokrąglone rogi.
Dialogi z prośbą o uprawnienia nie wypełniają dostępnej przestrzeni wyświetlania, ponieważ ich układ zwykle używa LayoutParams.WRAP_CONTENT zamiast LayoutParams.MATCH_PARENT.

Okno z zaokrąglonymi rogami prawidłowo umieszczone nad widoczną aktywnością uruchamiania.
Sposób obejścia problemu z kompatybilnością
Zachowaj widoczność czynności, które uruchamiają czynności dialogowe, do momentu, gdy użytkownik odpowie na dialog.
System zapewnia, że przezroczysta aktywność dziedziczy wszystkie ograniczenia od pierwszej nieprzezroczystej aktywności poniżej przezroczystej aktywności w grupie aktywności, w tym ograniczenia związane z:
- Tryb zgodności rozmiaru
- Orientacja
- Format obrazu
Gry w Unity
Gry Unity działają na Androidzie w trybie pełnoekranowym lub wielooknowym. Jednak wiele gier w Unity traci na chwilę fokus i przestaje wyświetlać treści, gdy aplikacja jest w trybie wielookiennym.
Problem
W wersji Unity 2019.4 dodano opcję Resizable Window
, aby umożliwić korzystanie z trybu wielookiennego na Androidzie. Jednak początkowa implementacja nie reagowała prawidłowo na cykl aktywności w trybie wielookiennym, przez co UnityPlayer zawieszał odtwarzanie, gdy aplikacja traciła fokus. Gracz renderuje czarny ekran lub ostatnią zamrożoną klatkę gry. rozgrywka wznawia się dopiero po dotknięciu ekranu przez użytkownika. Ten problem występuje w przypadku wielu aplikacji korzystających z silnika Unity, które wyświetlają się jako czarne okna w trybie wielookiennym.

Gra traci fokus w trybie wielu okien i renderuje się jako czarne okno.
Optymalizacja
Uaktualnij Unity do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. W ustawieniach odtwarzacza Androida pozostaw zaznaczoną opcję Resizable Window
, ponieważ w przeciwnym razie gra zostanie wstrzymana, gdy nie będzie aktywna, mimo że będzie w pełni widoczna w trybie wielookiennym.

Gra prawidłowo renderuje treści w trybie wielu okien, nawet gdy nie jest aktywna.
Sposób obejścia problemu z kompatybilnością
Producenci urządzeń mogą stosować zastąpienie OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
na poziomie aplikacji, aby wywołać fałszywe zdarzenie focus w trybie wielookiennym. Zastąpienie umożliwia ponowne wyświetlenie treści i uniemożliwia zaciemnienie.
Tryb okien na pulpicie
Aplikacje uruchamiane w środowisku okien na pulpicie mogą korzystać z dodatkowych trybów zgodności.
Aplikacje z zablokowaną orientacją można dowolnie zmieniać rozmiar. Nawet jeśli aktywność jest zablokowana w orientacji pionowej, użytkownicy mogą zmienić rozmiar aplikacji na orientację poziomą.

Aplikacje z zablokowaną orientacją nadal można swobodnie zmieniać.
Jeśli jednak aktywność jest zadeklarowana jako nierozszerzalna (resizeableActivity = false), interfejs aktywności jest skalowany przy zachowaniu tego samego formatu obrazu.

Interfejs użytkownika w przypadku aktywności zadeklarowanych jako nierozszerzalne jest skalowany.
Podgląd z aparatu w oknie na komputerze
Gdy aplikacje w trybie okna pulpitu uruchamiają podgląd aparatu, interfejs wizjera jest skalowany, zachowując oryginalny współczynnik proporcji. Pozostałą część okna aplikacji można dowolnie zmieniać.

Zmienianie rozmiaru okna z wizjerem aparatu
Testowanie aplikacji pod kątem problemów ze zgodnością
Aby przetestować aplikację i sprawdzić, jak działa na różnych formatach, skorzystaj z tych zasobów:
- Strumieniowanie danych z urządzeń: aby przetestować aplikację na urządzeniach produkcyjnych (w tym na urządzeniach referencyjnych) hostowanych w centrach danych Google, zapoznaj się z artykułem Strumieniowanie danych z urządzeń z Androidem z użyciem Firebase .
- Emulatory w Android Studio: informacje o tworzeniu emulatorów urządzeń referencyjnych znajdziesz w artykule Tworzenie urządzeń wirtualnych i zarządzanie nimi.
- Emulator Android Studio z możliwością zmiany rozmiaru: informacje o dostępie do urządzeń wirtualnych znajdziesz w artykule Uruchamianie aplikacji w emulatorze Androida.
Jest w formacie letterbox
Sprawdź, czy każda aktywność może używać całej przestrzeni wyświetlania dostępnej dla aplikacji. Najpierw zadeklaruj w folderze testowym następujący kod:
Kotlin
fun isLetterboxed(activity: AppCompatActivity): Boolean { if (isInMultiWindowMode) return false val wmc = WindowMetricsCalculator.getOrCreate() val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds val isScreenPortrait = maxBounds.height() > maxBounds.width() return if (isScreenPortrait) { currentBounds.height() < maxBounds.height() } else { currentBounds.width() < maxBounds.width() } }
Java
public boolean isLetterboxed(AppCompatActivity activity) { if (activity.isInMultiWindowMode()) { return false; } WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate(); Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds(); Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds(); boolean isScreenPortrait = maxBounds.height() > maxBounds.width(); return (isScreenPortrait) ? currentBounds.height() < maxBounds.height() : currentBounds.width() < maxBounds.width(); }
Następnie przeprowadź test, aby sprawdzić, czy zachowanie jest prawidłowe i czy aktywność docelowa nie jest otoczona ramką:
Kotlin
@get:Rule val activityRule = ActivityScenarioRule(MainActivity::class.java) @Test fun activity_launched_notLetterBoxed() { activityRule.scenario.onActivity { assertFalse(it.isLetterboxed()) } }
Java
@Rule public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class); @Test public void activity_launched_notLetterBoxed() { try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity( activity -> { assertFalse(isLetterboxed(activity)); }); } }
Najlepiej przeprowadzać tego typu testy tylko do momentu, gdy aplikacja przejdzie go pomyślnie i sprawdzi, czy jej aktywności zajmują całą dostępną dla niej przestrzeń wyświetlania. Przetestuj aplikację na wszystkich typach urządzeń, aby zapewnić spójne działanie.
Zastąpienia na poziomie aplikacji
Android udostępnia zastąpienia, które zmieniają skonfigurowane zachowanie aplikacji. Na przykład wartość zastąpienia FORCE_RESIZE_APP
instruuje system, aby pominąć tryb zgodności z rozmiarem i zmienić rozmiar aplikacji, tak aby pasował do wymiarów wyświetlacza, nawet jeśli w manifeście aplikacji jest określony parametr resizeableActivity="false"
.
Producenci urządzeń stosują zastąpienia w wybranych aplikacjach lub we wszystkich aplikacjach na określonych urządzeniach z dużym ekranem. W Androidzie 14 (poziom interfejsu API 34) i nowszych użytkownicy mogą stosować zastąpienia w aplikacjach za pomocą ustawień urządzenia. W Androidzie 16 (poziom interfejsu API 36) i nowszych właściciele wirtualnych urządzeń mogą stosować zastąpienia na wybranych urządzeniach, którymi zarządzają.
Zastępowanie użytkownika w poszczególnych aplikacjach
W Androidzie 14 i nowszych użytkownicy mogą zmieniać format obrazu aplikacji w menu ustawień. Menu jest dostępne na urządzeniach z dużym ekranem, takich jak urządzenia referencyjne.
Menu zawiera listę wszystkich aplikacji zainstalowanych na urządzeniu. Użytkownicy wybierają aplikację, a następnie ustawiają jej format obrazu na 3:4, 1:1, pełny ekran lub inną wartość skonfigurowaną przez producenta urządzenia. Użytkownicy mogą też zresetować format obrazu do domyślnego, który jest określony w pliku manifestu aplikacji.
Aplikacje mogą zrezygnować z zastąpienia zgodności, ustawiając te tagi PackageManager.Property
:
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
Aby zrezygnować z zastąpienia zgodności z formatem obrazu użytkownika, dodaj właściwość do pliku manifestu aplikacji i ustaw jej wartość na
false
:<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
Aplikacja zostanie wykluczona z listy aplikacji w ustawieniach urządzenia. Użytkownicy nie będą mogli zmienić formatu obrazu aplikacji.
Ustawienie tej właściwości na
true
nie ma żadnego wpływu.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
Aby zrezygnować z opcji pełnoekranowej w ramach zastąpienia zgodności z formatem obrazu użytkownika, dodaj tę właściwość do pliku manifestu aplikacji i ustaw jej wartość na
false
:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
Opcja pełnego ekranu zostanie usunięta z listy opcji formatu obrazu w ustawieniach urządzenia. Użytkownicy nie będą mogli zastosować zastąpienia pełnoekranowego w Twojej aplikacji.
Ustawienie tej właściwości na
true
nie ma żadnego wpływu.
Zoptymalizuj aplikację pod kątem wszystkich ekranów: nie ustawiaj ograniczeń współczynnika proporcji w aplikacji. Używaj klas rozmiarów okien, aby obsługiwać różne układy w zależności od ilości dostępnej przestrzeni wyświetlania.
Zastąpienia na urządzeniu według aplikacji
Producenci urządzeń i właściciele urządzeń wirtualnych (wybrane zaufane i uprzywilejowane aplikacje) stosują zastąpienia na poziomie aplikacji na określonych urządzeniach, takich jak tablety, urządzenia składane, urządzenia z ChromeOS i wyświetlacze samochodowe. Urządzenia referencyjne mogą domyślnie stosować niektóre zastąpienia do różnych aplikacji.
Aplikacje mogą zrezygnować z większości zastąpień (patrz tabela Zastąpienia na poziomie aplikacji poniżej).
Za pomocą platformy zgodności możesz przetestować aplikację z włączonymi lub wyłączonymi zastąpieniami (patrz Narzędzia platformy zgodności). Jeśli są włączone, zastąpienia są stosowane do całej aplikacji.
Możesz też użyć Android Debug Bridge (adb), aby włączyć lub wyłączyć zastąpienia i określić, które zastąpienia mają zastosowanie do Twojej aplikacji.
Włącz lub wyłącz zastąpienia w ten sposób:
adb shell am compat enable/disable <override name/id> <package>
W przypadku urządzeń referencyjnych sprawdź, które zastąpienia mają zastosowanie do Twojej aplikacji:
adb shell dumpsys platform_compat | grep <package name>
Tabela poniżej zawiera listę dostępnych zastąpień oraz wskazówki, jak zoptymalizować aplikację, aby nie musiała ona korzystać z zastąpień. Możesz dodać do pliku manifestu aplikacji flagi właściwości, aby zrezygnować z niektórych override’ów.
Zastąpienia na poziomie aplikacji | |||
---|---|---|---|
Typ | Nazwa | ID | Opis |
Możliwość zmiany rozmiaru | FORCE_RESIZE_APP | 174042936 | Omijaj tryb zgodności rozmiaru w przypadku aplikacji po zmianach konfiguracji. |
FORCE_NON_RESIZE_APP | 181136395 | Wymusza tryb zgodności z rozmiarem w przypadku zmian konfiguracji. | |
Format obrazu | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Zastąpienie bramki, które musi być włączone, aby zastosować inne zastąpienia formatu obrazu. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | Jeśli ta opcja jest włączona (domyślnie), limity zastępują zakres tylko dla aktywności w orientacji pionowej. | |
OVERRIDE_MIN_ASPECT_RATIO_SMALL | 349045028 | Zmień minimalny format obrazu na 4:3. | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | Zmień minimalny format obrazu na 3:2. | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | Zmień minimalny format obrazu na 16:9. | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | Zmienia minimalny format obrazu, aby pasował do 50% rozmiaru ekranu (lub formatu obrazu na podzielonym ekranie). | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | Wyłącza minimalne zastąpienie współczynnika proporcji, aby aplikacje były wyświetlane na pełnym ekranie w orientacji pionowej. | |
Orientacja | OVERRIDE_ANY_ORIENTATION | 265464455 | Umożliwia zastąpienie dowolnej orientacji. |
OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | Zastępuje ustawienia orientacji, możliwość zmiany rozmiaru i formatu obrazu. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | Zastępuje orientację pionową, gdy aktywność ma nieokreśloną orientację. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | Zastępuje orientację nosensor (użyj naturalnej orientacji urządzenia), gdy aktywność ma nieokreśloną orientację. |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | Obróci aplikacje tylko w orientacji poziomej o 180 stopni. | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | Ogranicza zakres zastępowania orientacji do sytuacji, gdy aplikacja jest połączona z kamerą. | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | Gdy zadanie jest wyświetlane na pełnym ekranie (w tym w trybie letterbox), wyświetlacz ustawia się na stałą orientację poziomą. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Ignoruje żądania dotyczące orientacji z aplikacji, aby uniknąć nieskończonych pętli obracania. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | Ignoruje powtarzające się żądania orientacji podczas ponownego uruchamiania aktywności. Jeśli Android wykryje, że aplikacja w ciągu 1 s prosi o co najmniej 2 nowe orientacje, system uzna to za nieskończony cykl obracania i zastosuje zastąpienie. | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | Zapobiega letterboxingowi przez wyłączenie ustawienia ignorowania prośby o orientację przez producenta urządzenia. | |
Interfejsy API piaskownicy | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Zapobiega zmianie działania interfejsów API wyświetlania. |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Wymusza, aby interfejsy API Display w aplikacji zwracały granice aplikacji. Interfejsy API Display zwracają logiczne granice obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API Display zwracają granice aplikacji, co prowadzi do problemów z interfejsem użytkownika. |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Wymusza na interfejsach API View używanych w aplikacji zwracanie granic aplikacji. Interfejsy API View zwracają logiczne granice obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API View zwracają granice aplikacji, co prowadzi do problemów z interfejsem użytkownika. |
|
Zgodność z aparatem | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Wyłącza przymusową rotację. Domyślnie wszystkie aplikacje aparatu z ustawionymi orientacjami są wymuszająco obracane, gdy otwarta jest podgląd aparatu. |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | Usuwa domyślne twarde odświeżanie stosowane, gdy podgląd aparatu jest wymuszająco obracany. | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Przełącza twarde odświeżanie na miękkie odświeżanie, gdy podgląd kamery zostanie wymuszająco obrócony, co pomaga zachować stan podczas wymuszonej rotacji. Domyślnie Android stosuje pełne odświeżanie, gdy podgląd aparatu jest wymuszająco obracany. Zmiana stanu może spowodować utratę stanu aplikacji lub jej wyłączenie, w zależności od tego, jak aplikacja przechowuje w pamięci podręcznej stan poprzedni. | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Przycina bufor obrazu z wewnętrznego przedniego aparatu. Jeśli zastąpienie jest wyłączone, przycinanie wewnętrznego przedniego aparatu zostanie usunięte, a pole widzenia podglądu aparatu zostanie powiększone. Domyślnie na niektórych składanych urządzeniach (patrz urządzenia referencyjne) system przycina podgląd aparatu we wszystkich aplikacjach aparatu, gdy używasz wewnętrznego przedniego aparatu. | |
Różne | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Zapobiega przyciemnianiu aplikacji, gdy traci ona fokus w trybie podzielonego ekranu. Aplikacja czeka na skupienie uwagi przed wyświetleniem treści, co może spowodować jej zawieszenie lub przyciemnienie. Zastąpienie umożliwia Androidowi wysłanie do aplikacji fałszywego zdarzenia dotyczącego stanu fokusu, które sygnalizuje aplikacji, że ma ponownie wyświetlać treści. |
FORCE_RESIZE_APP
Wymusza na pakietach, do których zastosowano zastąpienie, możliwość zmiany rozmiaru i wejścia w tryb wielu okien. Dotyczy wszystkich rozmiarów wyświetlaczy.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
W pliku manifestu aplikacji ustaw atrybut android:resizeableActivity
na true
.
Optymalizacja aplikacji
Używaj układów elastycznych, aby umożliwić aplikacjom dostosowanie się do wszystkich rozmiarów i formatów obrazu. Zapoznaj się z sekcją Obsługa różnych rozmiarów wyświetlania.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie i umożliwić zmianę rozmiaru aplikacji:
adb shell am compat enable FORCE_RESIZE_APP <package>
Aby usunąć zastąpienie:
adb shell am compat disable FORCE_RESIZE_APP <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
FORCE_NON_RESIZE_APP
Wymusza, aby pakiety, do których zastąpienie jest stosowane, nie były skalowalne i w przypadku zmian konfiguracji przechodziły w tryb zgodności z rozmiarem. Dotyczy wszystkich rozmiarów wyświetlacza.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
W manifeście aplikacji ustaw atrybut android:resizeableActivity
i flagę metadanych android.supports_size_changes
na false
oraz określ orientację lub współczynnik proporcji.
Optymalizacja aplikacji
Wszystkie aplikacje, które zachowują się prawidłowo po zmianie rozmiaru, powinny mieć ustawioną wartość android:resizeableActivity
lub android.supports_size_changes
na true
.
Inne aplikacje powinny być ulepszone, aby dobrze działały po zmianie rozmiaru. Zobacz android:resizeableActivity.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie i uniemożliwić zmianę rozmiaru aplikacji:
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
Aby usunąć zastąpienie:
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO
Bramka dla wszystkich zastąpień, które narzucają określony minimalny format obrazu.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw wartość android:minAspectRatio
na poziomie aktywności lub aplikacji.
Optymalizacja aplikacji
Nie ustawiaj w aplikacji ograniczeń dotyczących formatu obrazu. Upewnij się, że aplikacja obsługuje różne rozmiary wyświetlacza. Używaj klas rozmiarów okien, aby obsługiwać różne układy w zależności od ilości miejsca na ekranie, jaką ma Twoja aplikacja. Zapoznaj się z interfejsami Compose WindowSizeClass
API i View WindowSizeClass
API.
Jak wyłączyć lub zrezygnować z zastąpienia
Określ ograniczenie formatu obrazu lub ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
Ogranicza ustawienia aplikacji, które narzucają określony minimalny format obrazu w przypadku aktywności w orientacji pionowej. Domyślnie jest włączona i ma zastosowanie tylko wtedy, gdy włączona jest też zasada OVERRIDE_MIN_ASPECT_RATIO
.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_SMALL
Ustawia minimalny format obrazu aktywności na małą wartość (4:3).
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_SMALL
Ustawia minimalny format obrazu aktywności na małą wartość (4:3).
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
Ustawia minimalny format obrazu aktywności na średni (3:2).
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_LARGE
Ustawia minimalny format obrazu aktywności na dużą wartość (16:9).
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
Umożliwia korzystanie z ustawienia proporcji podzielonego ekranu. Pozwala aplikacji na wykorzystanie całej dostępnej przestrzeni w trybie podzielonego ekranu, bez stosowania letterboxa.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
Wyłącza minimalne zastąpienie formatu obrazu w trybie pełnoekranowym w orientacji pionowej, aby wykorzystać całą dostępną przestrzeń ekranu.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ANY_ORIENTATION
Umożliwia zastąpienie dowolnej orientacji za pomocą tych ustawień zastąpienia:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw atrybut pliku manifestu activity:screenOrientation
lub użyj interfejsu API Activity#setRequestedOrientation()
.
Optymalizacja aplikacji
Aplikacja powinna obsługiwać wszystkie orientacje. Zmiana orientacji to zmiana konfiguracji, którą można obsłużyć na 2 sposoby: pozwalając systemowi na zniszczenie i ponowne utworzenie aplikacji lub samodzielne zarządzanie zmianami konfiguracji. Jeśli zmiany konfiguracji wprowadzasz samodzielnie, stan aplikacji można zachować, używając ViewModel
. W niewielu przypadkach możesz zdecydować się na zablokowanie orientacji tylko na małych ekranach, ale może to nie działać tak dobrze jak w przypadku umożliwienia użytkownikowi obracania aplikacji w razie potrzeby. W Androidzie 12L i nowszych wersjach orientacja może zostać zastąpiona przez konfigurację urządzenia. Więcej informacji o obsługiwaniu zmian konfiguracji i obsługiwaniu wszystkich orientacji znajdziesz w artykułach Obsługa zmian konfiguracji, Omówienie ViewModel i Ograniczenie orientacji aplikacji na telefonach, ale nie na urządzeniach z dużym ekranem.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ANY_ORIENTATION_TO_USER
Umożliwia aplikacji wypełnienie dostępnej przestrzeni wyświetlacza. Zastępuje wszelkie ograniczenia dotyczące orientacji, zmiany rozmiaru i proporcji obrazu określone w pliku manifestu aplikacji. Ponadto ignoruje wszystkie połączenia na numer Activity#setRequestedOrientation()
lub Activity#getRequestedOrientation()
.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Nie ustawiaj atrybutu pliku manifestu
android:screenOrientation
ani nie ustawiaj go na"user"
.Ustaw atrybut pliku manifestu
android:resizeableActivity
natrue
.Na małych ekranach, aby umożliwić zmianę rozmiaru aplikacji przy wyłączonym trybie wielookienkowym (
android:resizeableActivity=false
), ustaw flagę metadanychandroid.supports_size_changes
natrue
. Nie ustawiaj opcjiminAspectRatio
imaxAspectRatio
.
Optymalizacja aplikacji
Umożliw aplikacji obsługę wszystkich orientacji. Nie ustawiaj specyfikacji screenOrientation
w pliku manifestu aplikacji. Obsługuj rozmiary aplikacji, tryb wielookienkowy i wszystkie proporcje ekranu, ustawiając atrybut android:resizeableActivity
w pliku manifestu aplikacji na true
. Zapoznaj się z sekcją Obsługa różnych rozmiarów wyświetlania.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
Włącza orientację pionową dla wszystkich aktywności w pakiecie. Jeśli nie jest włączona opcja OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa żadnego innego stałego ułożenia.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
Umożliwia orientację bez czujnika we wszystkich aktywnościach w pakiecie. Jeśli nie włączono parametru OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa żadnego innego stałego ułożenia.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Włącza orientację reverseLandscape dla wszystkich aktywności w pakiecie. Jeśli nie włączono parametru OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa żadnego innego stałego ułożenia.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
Ograniczenia OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR, i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE zastąpień mają zastosowanie tylko wtedy, gdy połączenie z kamerą jest aktywne.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
Ogranicza orientację wyświetlacza do orientacji poziomej, gdy spełnione są te warunki:
- Aktywność jest wyświetlana na pełnym ekranie
- Właściwość komponentu Wyłączanie
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
nie jest włączona - Urządzenie producenta: ustawienie ignorowania orientacji jest włączone dla wyświetlacza.
- Naturalna orientacja wyświetlacza to orientacja pozioma.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
Włącza zasadę zgodności, która pomija aktualizację orientacji aplikacji w odpowiedzi na wywołanie Activity#setRequestedOrientation()
, gdy aplikacja jest ponownie uruchamiana lub ma aktywne działanie dotyczące zgodności z aparatami.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
na true
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
Włącza zasadę zgodności, która ignoruje żądaną orientację aplikacji w odpowiedzi na wywołanie aplikacji Activity#setRequestedOrientation()
więcej niż 2 razy w ciągu 1 sekundy, jeśli aktywność nie jest ograniczona do obramowania w ramach orientacji stałej.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
Wyklucza pakiety z zachowania ignorowania prośby o zignorowanie orientacji, które może być włączone przez producentów urządzeń w przypadku obszaru ekranu lub całego ekranu.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Nie ma możliwości rezygnacji. Wyłączenie zastąpienia może być niebezpieczne, jeśli aplikacja jest niezgodna z urządzeniem, na którym włączone jest ustawienie producenta ignorujące prośbę o orientację. Aby wyłączyć zastąpienie, skontaktuj się z zespołem ds. relacji z deweloperami Androida.
Flagi usług do dostosowania zastępowania
Brak flag właściwości dla tego zastąpienia.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
NEVER_SANDBOX_DISPLAY_APIS
Wymusza, aby pakiety nigdy nie miały zastosowanego piaskownicy interfejsu API Display
w przypadku aktywności w trybie letterbox lub zgodności z rozmiarem. Interfejsy API Display
nadal podają granice obszaru wyświetlania.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zadeklaruj możliwość zmiany rozmiaru aktywności, ustawiając atrybut pliku manifestu android:resizeableActivity
na true
lub flagę metadanych android.supports_size_changes
na true
.
Optymalizacja aplikacji
Aplikacje, które deklarują, że można je w pełni zmieniać, nigdy nie powinny polegać na rozmiarze wyświetlacza do pozycjonowania elementów interfejsu. Przeprowadź migrację aplikacji na aktualne interfejsy API, które zapewniają WindowMetrics
. Jeśli używasz Jetpack Compose, korzystaj z interfejsu API WindowSizeClass
, aby wyświetlać interfejs użytkownika w zależności od tego, jaką część ekranu zajmuje aktualnie aplikacja. Zobacz Korzystanie z klas rozmiarów okien.
Jak wyłączyć lub zrezygnować z zastąpienia
Nie ma możliwości rezygnacji. Przejdź z wycofanych interfejsów API.
Flagi usług do dostosowania zastępowania
Brak flag właściwości dla tego zastąpienia.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>
Aby usunąć zastąpienie:
adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
ALWAYS_SANDBOX_DISPLAY_APIS
Wymusza na pakietach zawsze stosowanie Display
piaskownicy interfejsu API niezależnie od trybu okna. Interfejsy API Display
zawsze podają granice aplikacji.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zadeklaruj, że aktywności nie można zmieniać, ustawiając atrybut android:resizeableActivity
na false
lub flagę metadanych android.supports_size_changes
na false
.
Optymalizacja aplikacji
Aplikacje, które deklarują, że można je w pełni zmieniać, nigdy nie powinny polegać na rozmiarze wyświetlacza do pozycjonowania elementów interfejsu. Przejdź z wykownych interfejsów API na aktualne interfejsy API, które zapewniają WindowMetrics
. Zobacz WindowMetricsCalculator
.
Jak wyłączyć lub zrezygnować z zastąpienia
Nie ma możliwości rezygnacji. Przejdź z wycofanych interfejsów API.
Flagi usług do dostosowania zastępowania
Brak flag właściwości dla tego zastąpienia.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Aby usunąć zastąpienie:
adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
Wymusza umieszczenie w piaskownicy tych interfejsów API View
:
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Rozwiąż problem w kodzie aplikacji, używając interfejsów API, które podają granice okna aplikacji i odstępy względem okna aplikacji, a nie granice wyświetlacza urządzenia i odstępy względem wyświetlacza urządzenia.
Optymalizacja aplikacji
Aplikacje powinny używać interfejsów API View
, biorąc pod uwagę możliwość zastosowania letterboxa i trybu wielu okien. Patrz WindowMetricsCalculator
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
Wyłącza wymuszanie orientacji. Zwiększa wygodę użytkowników w niektórych aplikacjach.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
na false
.
Optymalizacja aplikacji
Nie polegaj na zapisanej w pamięci podręcznej orientacji czujnika aparatu ani informacjach o urządzeniu. Więcej informacji o zgodności kamery znajdziesz w artykule Wprowadzenie do wizjerów kamer i Obsługa powierzchni skalowanych w aplikacji aparatu.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
na true
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, które usuwa wymuszone obracanie:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Aby usunąć zastąpienie, które umożliwia przymusową rotację:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
Wyłącza odświeżanie aktywności po wymuszonej rotacji. Zwiększa wygodę użytkowników, gdy odświeżanie powoduje utratę stanu w aplikacjach.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
na false
.
Optymalizacja aplikacji
Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
na true
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, które usuwa odświeżanie aktywności:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Aby usunąć zastąpienie, które umożliwia odświeżanie aktywności:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
Sprawia, że pakiety, do których jest stosowany, odświeżają aktywność w cyklu onResume()
→onPause()
→onResume()
, a nie onResume()
→onStop()
→onResume()
po wymuszonej rotacji zgodności z aparatami.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
na true
.
Optymalizacja aplikacji
Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
Wymusza przycięcie obrazu w przeciwnej orientacji, gdy orientacja portretowa aparatu nie jest zgodna z naturalną orientacją urządzenia. Wiele aplikacji nie radzi sobie z taką sytuacją i wyświetla rozciągnięte obrazy.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
na true
.
Optymalizacja aplikacji
Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, które stosuje przycinanie wewnętrznego przedniego aparatu:
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Aby usunąć zastąpienie, które powoduje przycięcie wewnętrznego przedniego aparatu:
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
Uniemożliwia aplikacjom rezygnację z udostępniania ekranu (patrz Projekcja multimediów). Wdrażane, gdy aplikacje nadużywają interfejsu API createConfigForDefaultDisplay()
, aby wymuszać przechwytywanie całego ekranu i narażać prywatność użytkowników, ujawniając zawartość powiadomień, które są przechwytywane w trybie pełnoekranowym, ale nie w trybie udostępniania ekranu aplikacji, oraz wszystkich aplikacji niezależnie od trybu okna.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zezwól na domyślne zachowanie funkcji rzutowania multimediów (wdrożone w Androidzie 14, interfejs API poziomu 34 z createScreenCaptureIntent()
), które umożliwia użytkownikom wybranie, czy udostępniać cały ekran, czy okno pojedynczej aplikacji niezależnie od trybu okna. Możesz też wywołać funkcję createScreenCaptureIntent(MediaProjectionConfig)
z argumentem MediaProjectionConfig
zwracanym przez funkcję createConfigForUserChoice()
.
Optymalizacja aplikacji
Umożliwia użytkownikom wybranie, czy podczas wyświetlania multimediów mają udostępniać cały ekran urządzenia czy okno aplikacji. Od Androida 14 jest to zachowanie domyślne.
Umożliw zmianę rozmiaru aplikacji (resizeableActivity="true"
), aby obsługiwała tryb wielookien.
Jak wyłączyć lub zrezygnować z zastąpienia
Ze względu na poważne znaczenie prywatności użytkownika Twoja aplikacja nie może wyłączyć tej zastępczej funkcji ani zrezygnować z niej.
Flagi usług do dostosowania zastępowania
Brak.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, które anuluje rezygnację z udostępniania ekranu na części (czyli włącza udostępnianie ekranu na części):
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Aby usunąć zastąpienie, które umożliwia aplikacji rezygnację z udostępniania części ekranu:
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
Umożliwia wysyłanie fałszywego stanu skupienia w przypadku aplikacji, które nie są w centrum uwagi w trybie podzielonego ekranu. Niektóre silniki gier czekają na uzyskanie fokusa przed narysowaniem zawartości aplikacji. Dzięki temu aplikacje nie pozostają czarne, gdy są wznawiane i jeszcze nie mają fokusa.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na true
.
Optymalizacja aplikacji
Aby uniknąć tego problemu, zadbaj o to, aby Twoja aplikacja dobrze obsługiwała różne orientacje i zmiany konfiguracji. Przygotuj aplikację na wyświetlanie na dużym ekranie, postępując zgodnie ze wskazówkami dotyczącymi jakości aplikacji na duży ekran.
Jeśli używasz silnika gier Unity, uaktualnij go do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. W ustawieniach odtwarzacza na Androidzie pozostaw zaznaczoną opcję Okno do zmiany rozmiaru.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
Dodatkowe materiały
- Wskazówki dotyczące jakości aplikacji na duże ekrany
- Wskazówki dotyczące ogólnej jakości aplikacji
-
Właściciel urządzenia wirtualnego to zaufana lub uprzywilejowana aplikacja, która zarządza urządzeniem wirtualnym. Właściciele urządzeń wirtualnych tworzą urządzenia wirtualne, aby renderować aplikacje, a następnie wyświetlać je na urządzeniach zdalnych, takich jak komputery osobiste, urządzenia do rzeczywistości wirtualnej czy systemy informacyjno-rozrywkowe w samochodach. Właściciel wirtualnego urządzenia jest na urządzeniu lokalnym, takim jak telefon. ↩