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 nieoptymalną użytecznością.
Zastąpienia dla poszczególnych aplikacji umożliwiają producentom urządzeń, właścicielom urządzeń wirtualnych1 i użytkownikom zmianę działania aplikacji w celu poprawy układu lub zapobiegania nieprawidłowemu działaniu aplikacji na wybranych urządzeniach.
Android 16
Android 16 (poziom API 36) ignoruje ograniczenia dotyczące orientacji ekranu, formatu obrazu i możliwości zmiany rozmiaru aplikacji, aby poprawić układ aplikacji na urządzeniach o najmniejszej szerokości ≥ 600 dp.
W przypadku aplikacji kierowanych na poziom interfejsu API 36 te zastąpienia dla poszczególnych aplikacji nie działają:
- 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
- OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
Zrezygnuj
Aplikacja może być kierowana na interfejs API na poziomie 36, ale może nie korzystać z zachowania Androida 16. W takim przypadku uprawnienie 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
W przypadku tych urządzeń może być konieczne zastąpienie ustawień dla poszczególnych aplikacji ze względu na nietypowe konfiguracje lub konfiguracje, które nie są dobrze obsługiwane przez aplikacje:
- Tablety: naturalną orientacją niektórych tabletów, np. Pixel Tablet, jest orientacja pozioma. Urządzenie jest w naturalnej orientacji, gdy funkcja
Display#getRotation()
zwraca wartośćSurface.ROTATION_0
. Jeśli aplikacje zakładają, żeROTATION_0
to orientacja pionowa, układy aplikacji i podgląd kamery mogą nie pasować do wyświetlacza urządzenia. - Urządzenia składane w orientacji poziomej: niektóre urządzenia składane, takie jak Pixel Fold, są w orientacji pionowej, gdy są złożone, a w orientacji poziomej, gdy są rozłożone. Jeśli aplikacje zakładają, że rozłożony ekran jest w orientacji pionowej, prawdopodobnie wystąpią migoczące pętle lub problemy z układem.
- Składane telefony z klapką: rozłożone telefony z klapką są zwykle w orientacji pionowej. Po złożeniu telefony mają zwykle mały ekran w orientacji poziomej. Aplikacje muszą rozpoznawać różne orientacje wyświetlaczy i się do nich dostosowywać.
- Wyświetlacze zewnętrzne: na wybranych urządzeniach można rozpocząć sesję okien na pulpicie na zewnętrznych, podłączonych wyświetlaczach. Aplikacje muszą wysyłać zapytania do wyświetlaczy zewnętrznych o informacje takie jak rozmiar ekranu i rozdzielczość. W przeciwnym razie mogą przyjmować błędne założenia dotyczące wyświetlaczy, co może prowadzić do nieprawidłowego działania aplikacji.
- Wyświetlacze samochodowe: wiele wyświetlaczy samochodowych, ale nie wszystkie, ma orientację poziomą. Tworzenie aplikacji na postoju na wyświetlacze samochodowe jest podobne do tworzenia aplikacji na tablety.
Typowe problemy ze zgodnością
Problemy z kompatybilnością aplikacji najczęściej wynikają z ograniczeń orientacji aplikacji, ograniczeń dotyczących zmiany rozmiaru i formatu obrazu, nieprawidłowego obsługiwania orientacji podglądu z kamery oraz niewłaściwego używania interfejsów API.
Letterboxing
Letterboxing umieszcza aplikację na środku ekranu lub, w przypadku dużych ekranów, po jednej ze stron, aby zapewnić wygodny dostęp. Maty (paski w jednolitym kolorze lub rozmyta tapeta) wypełniają niewykorzystany obszar wyświetlania po bokach lub u góry i u dołu aplikacji.
Letterboxing często występuje na urządzeniach z dużym ekranem, ponieważ wymiary i format obrazu wyświetlacza urządzenia są zwykle inne niż w przypadku standardowych telefonów, dla których zaprojektowano większość aplikacji.

Rysunek 1. Aplikacja ograniczona do orientacji pionowej jest wyświetlana w formacie letterbox na tablecie i urządzeniu składanym 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 zmieniać.
Ustawienia konfiguracji, które kontrolują orientację i możliwość zmiany rozmiaru aplikacji, obejmują:
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ć rozmiar aplikacji, aby dopasować je do okien o różnych wymiarach. W przypadku Androida 11 (poziom 30 interfejsu API) i starszych wersji określa, czy aplikacje obsługują tryb wielu okien. W przypadku Androida 12 (poziom API 31) i nowszych wersji określa, czy aplikacje obsługują tryb wielu okien na małych ekranach (kompaktowa klasa rozmiaru okna). Na urządzeniach z Androidem 12 lub nowszym aplikacje obsługują tryb wielu okien na dużych ekranach (średnia lub rozszerzona klasa rozmiaru okna) niezależnie od tego ustawienia.maxAspectRatio
: określa maksymalny współczynnik proporcji obsługiwany przez aplikację. Tylko aplikacje, w których parametrresizeableActivity
ma wartośćfalse
, mogą ustawić parametrmaxAspectRatio
.minAspectRatio
: określa minimalny współczynnik proporcji obsługiwany przez aplikację. Tylko aplikacje, w których parametrresizeableActivity
ma wartośćfalse
, mogą ustawić parametrminAspectRatio
.

Aplikacja ograniczona do orientacji pionowej nie działa na urządzeniu w orientacji poziomej.
Optymalizacja
Aplikacja powinna obsługiwać wszystkie orientacje i rozmiary wyświetlaczy urządzeń oraz tryb wielu okien. Usuń z układów aplikacji i pliku manifestu aplikacji wszystkie ograniczenia dotyczące orientacji i stałego współczynnika proporcji.

Aplikacja obsługuje wszystkie orientacje urządzenia.
Obejście problemu ze zgodnością
Jeśli aplikacja o stałej orientacji lub stałym współczynniku proporcji jest uruchamiana w oknie, którego rozmiaru lub orientacji nie obsługuje bezpośrednio, Android dodaje do niej czarne pasy, aby zachować ciągłość.
Od Androida 12 (poziom API 31) i 12L (poziom API 32) platforma wprowadza różne ulepszenia w przypadku aplikacji z paskami po bokach. Producenci urządzeń wdrażają ulepszenia interfejsu. Aby skorzystać z tych ulepszeń, nie musisz wprowadzać w aplikacji żadnych dodatkowych zmian.
Android 12 (API na poziomie 31) wprowadza te ulepszenia wizualne, które mogą być konfigurowane przez producentów urządzeń:
- Zaokrąglone rogi: rogi okna aplikacji mają bardziej dopracowany wygląd.
- Przezroczystość paska systemowego: paski stanu i nawigacji, które nakładają się na aplikację, są półprzezroczyste, dzięki czemu ikony na paskach są zawsze widoczne na tle letterbox.
- Konfigurowany format obrazu: format obrazu aplikacji można dostosować w celu poprawy jej wyglądu.

Rysunek 2. Aplikacja w formacie letterbox z ulepszonym interfejsem.
Android 12L (poziom interfejsu API 32) wprowadza te ulepszenia funkcjonalne:
Konfigurowalne położenie: na dużych ekranach producenci urządzeń mogą umieszczać aplikację po lewej lub prawej stronie wyświetlacza, co ułatwia interakcję.
Przeprojektowany przycisk ponownego uruchamiania: producenci urządzeń mogą nadać przyciskowi ponownego uruchamiania w trybie zgodności rozmiaru nowy wygląd, aby użytkownicy mogli go łatwiej rozpoznać.
W Androidzie 13 (poziom API 33) dodano okno z informacjami dla użytkownika o umieszczaniu aplikacji w trybie letterbox na ekranie lub o uwzględnianiu tego trybu w trybie podzielonego ekranu:

Rysunek 3. Aplikacja w formacie letterbox z oknem informacyjnym dla użytkownika.
Tryb zgodności rozmiaru
Tryb zgodności rozmiaru to letterboxing, który zachowuje proporcje aplikacji i zawiera kontrolkę ponownego uruchamiania. Ten element sterujący umożliwia użytkownikom ponowne uruchomienie aplikacji i odświeżenie wyświetlacza. Android wywołuje tryb zgodności rozmiaru w przypadku aplikacji, których rozmiaru nie można zmieniać. Gdy aktywność zostanie przeniesiona do kontenera wyświetlania, który jest niezgodny z jej wymiarami, system może zmienić rozmiar aplikacji, aby wypełnić ekran urządzenia w co najmniej jednym wymiarze.
Zmiany konfiguracji urządzenia, które mogą aktywować tryb zgodności rozmiaru, obejmują:
- Obracanie urządzenia
- Składane urządzenie jest składane lub rozkładane
- Przełączanie między trybem pełnoekranowym a trybem podzielonego ekranu
Problem
Tryb zgodności rozmiaru jest zwykle stosowany w przypadku działań, które mają ograniczenia dotyczące orientacji lub proporcji i są skonfigurowane (lub określone przez system) jako niemożliwe do zmiany rozmiaru.
Aplikacja jest uznawana za aplikację o zmiennych rozmiarach i nie jest umieszczana w trybie zgodności rozmiarów, jeśli spełnia którekolwiek z tych kryteriów:
- Można zmieniać jego rozmiar za pomocą
resizeableActivity="true"
. - Obsługuje tryb obrazu w obrazie (PIP).
- Jest umieszczony
- Czy producent urządzenia zastosował zastąpienie
FORCE_RESIZE_APP
dla poszczególnych aplikacji (właściwości ustawione przez aplikację są ignorowane)?
Jeśli aplikacja nie spełnia żadnego z tych warunków, uznajemy ją za niemożliwą do zmiany rozmiaru i może ona zostać umieszczona w trybie zgodności rozmiaru.

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

Aplikacja działa we wszystkich rozmiarach okien.
Obejście problemu ze zgodnością
Android przełącza aplikację w tryb zgodności rozmiaru, gdy system stwierdzi, że wyświetlanie aplikacji z paskami po bokach można poprawić, zmieniając jej rozmiar tak, aby wypełniała okno wyświetlania przynajmniej w jednym wymiarze. System wyświetla element sterujący ponownym uruchomieniem, który odtwarza proces aplikacji, odtwarzając aktywność i ponownie rysując wyświetlacz. Zobacz też omówienie procesów i wątków.

Aplikacja tylko w orientacji pionowej z paskami po bokach w orientacji poziomej, przeskalowana przez element sterujący ponownym uruchomieniem.
Tryb zgodności wyświetlania
Tryb zgodności wyświetlania zapobiega ponownemu uruchamianiu aplikacji, gdy przenosi się ona między różnymi wyświetlaczami, co może spowodować zmianę konfiguracji, np. trybu kolorów, dostępności ekranu dotykowego lub gęstości ekranu.
Tryb zgodności wyświetlania jest domyślnie włączony w przypadku gier (na podstawie flagi android:appCategory
), aby zwiększyć stabilność i ciągłość.
W przeciwieństwie do trybu zgodności rozmiaru tryb zgodności wyświetlania nie blokuje konfiguracji aplikacji. Aplikacja może nadal otrzymywać wszystkie aktualizacje konfiguracji za pomocą interfejsów API, takich jak wywołanie zwrotne onConfigurationChanged()
, ale nie musi być ponownie uruchamiana. Oznacza to, że gry, które prawidłowo obsługują interfejsy API, takie jak onConfigurationChanged(), mogą nadal dynamicznie aktualizować interfejs, nawet jeśli są w trybie zgodności wyświetlania.
Aby zrezygnować z trybu zgodności wyświetlania i obsługiwać zmiany konfiguracji w aplikacji, zadeklaruj obsługę zmian konfiguracji w pliku AndroidManifest.xml
aplikacji i obsługuj zmiany konfiguracji w wywołaniu zwrotnym onConfigurationChanged().
<activity
android:name=".MyGameActivity"
android:configChanges="colorMode|touchscreen|density|...">
...
</activity>
Migoczące pętle
Jeśli aplikacja nie obsługuje wszystkich orientacji wyświetlania, może wielokrotnie wysyłać żądania nowych orientacji po wystąpieniu zmiany konfiguracji, co powoduje nieskończoną pętlę, w wyniku której ekran miga lub aplikacja obraca się bez końca.
Problem
Na urządzeniach z Androidem 12 (API na poziomie 31) i nowszym producenci mogą skonfigurować urządzenia tak, aby ignorowały ograniczenia orientacji określone przez aplikacje i zamiast tego wymuszały tryby zgodności. Na przykład urządzenie składane może ignorować ustawienie android:screenOrientation="portrait"
aktywności, gdy jest ona wyświetlana na wewnętrznym ekranie urządzenia w orientacji poziomej o rozmiarze tabletu.
Jeśli ograniczenia orientacji aplikacji są ignorowane, może ona programowo ustawić swoją orientację, wywołując funkcję Activity#setRequestedOrientation()
. Wywołanie powoduje ponowne uruchomienie aplikacji, jeśli nie obsługuje ona zmian konfiguracji (patrz Obsługa zmian konfiguracji). Po ponownym uruchomieniu ograniczenia dotyczące orientacji aplikacji są ponownie ignorowane, aplikacja powtarza wywołanie funkcji setRequestedOrientation()
, wywołanie powoduje ponowne uruchomienie aplikacji i tak dalej w samopodtrzymującej się pętli.
Innym przypadkiem, w którym może się to zdarzyć, jest sytuacja, gdy naturalna orientacja (zwykła orientacja określona przez Androida) ekranu urządzenia jest pozioma (tzn. wywołanie Display#getRotation()
zwraca Surface.ROTATION_0
, a urządzenie ma proporcje poziome). W przeszłości aplikacje zakładały, że Display.getRotation() =
Surface.ROTATION_0
oznacza orientację pionową urządzenia, ale nie zawsze tak jest, np. na ekranie wewnętrznym niektórych urządzeń składanych i na niektórych tabletach.
Aplikacja w orientacji poziomej na wewnętrznym wyświetlaczu składanego urządzenia może sprawdzić obrót ekranu, otrzymać wartość ROTATION_0
, założyć, że naturalna orientacja urządzenia to pionowa, i wywołać setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
, aby ponownie skonfigurować 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ńczoną pętlę.

Aplikacja działająca tylko w trybie poziomym na wyświetlaczu w trybie pionowym wielokrotnie wywołuje funkcję Activity#setRequestedOrientation()
.
Optymalizacja
Aplikacje nie powinny wykonywać tych czynności:
- Ustaw domyślną orientację za pomocą metody
Activity#setRequestedOrientation()
w aktywnościonCreate()
, ponieważ żądanie orientacji może zostać nieoczekiwanie wywołane przez nieobsługiwane zmiany konfiguracji. - Załóż, że naturalna orientacja urządzenia (
ROTATION_0
) to pionowa. - Ustawianie orientacji na podstawie sygnałów niezwiązanych z bieżącym rozmiarem okna, takich jak
Display#getRotation()
, obecnośćFoldingFeature
lub wycofane interfejsy API.

Aplikacja obsługuje zmianę konfiguracji, nie ma ograniczeń dotyczących orientacji, więc nie wchodzi w pętlę migotania.
Obejście problemu ze zgodnością
Android ignoruje wywołania funkcji Activity#setRequestedOrientation()
w tych sytuacjach:
Aktywność została już ponownie uruchomiona w wyniku poprzedniego wywołania metody lub włączono wymuszone obracanie w przypadku niezgodności z kamerą (patrz Podgląd z kamery poniżej).
Producenci urządzeń mogą zastosować to zachowanie w przypadku aplikacji z
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
.Aktywność wysłała ponad 2 żądania dotyczące orientacji w ciągu 1 sekundy, 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ć nieprawidłowo wyrównany lub zniekształcony na tabletach, laptopach i wyświetlaczach składanych.
Problem
W dokumencie definicji zgodności Androida stwierdza się, że czujnik obrazu aparatu „MUSI być zorientowany 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 orientacja czujnika aparatu są pionowe – 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 urządzenia składane, mogą mieć wiele naturalnych orientacji i wiele czujników aparatu w różnych orientacjach.
Rozpoczęcie aktywności z orientacją aparatu, której aplikacja nie oczekuje, lub przełączanie się między różnymi aparatami lub ekranami urządzenia (w przypadku urządzeń składanych) może spowodować nieprawidłowe wyrównanie lub zniekształcenie podglądu z aparatu.

Niewyrównany i zniekształcony podgląd z aparatu na składanym urządzeniu z dużym ekranem.
Optymalizacja
Aplikacje aparatu muszą prawidłowo rozpoznawać i zarządzać orientacją urządzenia oraz orientacją czujnika aparatu, aby wyświetlać prawidłowo wyrównany i skalowany podgląd z kamery. Aplikacje muszą obliczać obrót urządzenia, obrót czujnika oraz współczynnik proporcji ekranu lub okna, a następnie stosować wyniki do podglądu z aparatu. Szczegółowe wskazówki znajdziesz w sekcjach Podgląd z aparatu i Wprowadzenie do wizjera aparatu.

Podgląd z kamery jest prawidłowo wyrównany i skalowany we wszystkich orientacjach urządzenia.
Obejście problemu ze zgodnością
Urządzenie jest w orientacji naturalnej, gdy Display#getRotation()
zwraca Surface.ROTATION_0
. System oblicza
CameraCharacteristics.SENSOR_ORIENTATION
na podstawie naturalnego położenia urządzenia. Android dopasowuje okno aplikacji działających tylko w orientacji pionowej do naturalnej orientacji urządzenia, co jest zgodne z oczekiwaniami większości aplikacji. Android przycina też obraz z matrycy aparatu, gdy orientacja matrycy jest pozioma, a podgląd z aparatu jest pionowy. Oto konkretne obejścia:
Wymuś obracanie podglądu z kamery w przypadku aplikacji, które mogą działać tylko w orientacji pionowej: aplikacje, które mogą działać tylko w orientacji pionowej, oczekują, że naturalna orientacja urządzenia i orientacja czujnika aparatu będą pionowe. Jednak na Androidzie 12 (poziom API 31) i nowszym aplikacje mogą działać w różnych orientacjach urządzenia, jeśli producenci urządzeń zignorują specyfikację orientacji.
Gdy aplikacja z ograniczeniem do trybu portretowego jest połączona z aparatem, Android wymusza obracanie aplikacji, aby dopasować okno aplikacji w trybie portretowym do naturalnej orientacji urządzenia.
Na niektórych tabletach (patrz urządzenia referencyjne) okno aplikacji w orientacji pionowej jest obracane do trybu pełnoekranowego w orientacji pionowej, aby dopasować się do naturalnej orientacji urządzenia. Po wymuszeniu obrotu aplikacja zajmuje cały ekran.
Tablet – wymuś obracanie aplikacji, w której orientacja pionowa jest ograniczona.
Na wewnętrznym ekranie składanych urządzeń w orientacji poziomej (patrz urządzenia referencyjne) aktywności tylko w orientacji pionowej są obracane do orientacji poziomej, aby dopasować się do naturalnej orientacji po rozłożeniu. Po wymuszeniu obrotu aplikacja jest wyświetlana w formacie letterbox.
Urządzenie składane – wymuś obracanie aplikacji, która może działać tylko w trybie pionowym. Aplikacja jest też wyświetlana w formacie letterbox.
Kadrowanie z wewnętrznego aparatu przedniego: czujnik wewnętrznego aparatu przedniego na niektórych urządzeniach składanych jest ustawiony w orientacji poziomej. Oprócz wymuszonego obracania podglądu z kamery 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 z kamery: system przełącza się między metodami aktywności
onStop()
ionStart()
(domyślnie) lubonPause()
ionResume()
(stosowanymi przez zastąpienie OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE dla poszczególnych aplikacji) po wymuszeniu obrotu, aby zapewnić prawidłowe wyświetlanie podglądu z kamery.Skalowanie formatu obrazu: system dynamicznie zmienia format obrazu podglądu kamery obróconej siłą na wyższy minimalny format obrazu, co zapewnia prawidłowe skalowanie podglądu kamery.
Deweloperzy aplikacji mogą zastąpić te obejścia, jeśli aplikacje prawidłowo obsługują podgląd z kamery. Zobacz Zastąpienia dla poszczególnych aplikacji.
Interfejsy API, które są często używane w nieprawidłowy sposób
W miarę dodawania do Androida obsługi funkcji takich jak tryb wielu okien i urządzeń takich jak składane telefony starsze interfejsy API zostały wycofane i zastąpione aktualnymi interfejsami API, które działają na wszystkich rozmiarach wyświetlaczy i urządzeniach o różnych kształtach. Wycofane interfejsy API są jednak nadal dostępne ze względu na zgodność wsteczną.
Niektóre interfejsy View
API są przeznaczone do specjalnych celów, które nie zawsze są dobrze rozumiane przez programistów.
Problem
Deweloperzy nadal korzystają z wycofanych interfejsów APIDisplay
i błędnie zakładają, że zwracają one granice aplikacji zamiast granic obszaru wyświetlania urządzenia. lub deweloperzy błędnie używają interfejsów API widoku specjalnego do uzyskiwania ogólnych danych wyświetlania.
Powoduje to nieprawidłowe obliczenia podczas zmiany położenia elementów interfejsu po zmianie rozmiaru okna aplikacji, co prowadzi do problemów z układem.
Wycofane i często niewłaściwie używane interfejsy API Display:
Więcej informacji znajdziesz w artykule Obsługa trybu wielu okien.
Nadużywanie interfejsów API widoku:

Wycofany interfejs API nieprawidłowo oblicza granice aplikacji. Zawartość aplikacji znika z ekranu.
Optymalizacja
Nigdy nie polegaj na fizycznym rozmiarze wyświetlacza przy pozycjonowaniu elementów interfejsu. Przeprowadź migrację aplikacji do interfejsów API opartych na WindowMetrics
, w tym do tych interfejsów API:WindowManager
Platforma:
Jetpack:

Interfejs API prawidłowo oblicza dane okna aplikacji.
Obejście problemu ze zgodnością
Dwa zastąpienia dostosowują wycofane interfejsy API Display
i nieprawidłowo używane interfejsy API View
, aby zwracać granice aplikacji: ALWAYS_SANDBOX_DISPLAY_APIS
w przypadku interfejsów API Display
i OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
w przypadku interfejsów API View
. ALWAYS_SANDBOX_DISPLAY_APIS
jest też domyślnie stosowany w przypadku aplikacji, które kwalifikują się do trybu zgodności rozmiaru.
Przejrzyste działania
Przejrzyste aktywności są wynikiem przezroczystych stylów tła, np.:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Motywy związane z oknami, takie jak Theme.MaterialComponents.Dialog
, mogą zawierać style, które sprawiają, że aktywności są przezroczyste.
Przezroczyste aktywności nie zajmują całej dostępnej przestrzeni wyświetlania, co utrudnia nimi zarządzanie, ponieważ dostępny obszar 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 wielu okien.
Problem
Przezroczyste działanie powinno mieścić się w granicach pierwszego nieprzezroczystego działania znajdującego się poniżej niego w stosie działań zadania. Jednak nieprzezroczysta aktywność, która uruchamia okno dialogowe z prośbą o uprawnienia, może być trampoliną (aktywnością, która uruchamia inną aktywność, a potem znika). W takim przypadku system nie może określić granic aktywności trampoliny, która uruchomiła przezroczystą aktywność okna dialogowego z prośbą o uprawnienia.

Okno dialogowe jest nieprawidłowo umieszczone, ponieważ aktywność została uruchomiona z trampoliny.
Optymalizacja
Przezroczyste aktywności dziedziczą ograniczenia po najbardziej zewnętrznej nieprzezroczystej aktywności znajdującej się pod nimi w stosie aktywności zadania. Nieprzezroczyste działanie musi być dostępne przez cały cykl życia przezroczystego działania, od jego utworzenia do usunięcia. Z tego powodu nie wysyłaj próśb o uprawnienia z działań trampolinowych.
Jeśli aktywność trampoliny wyśle prośbę o uprawnienia, użytkownik może nie zobaczyć okna z prośbą, ponieważ aktywność trampoliny zostanie zniszczona, zanim użytkownik zdąży na nią odpowiedzieć. Wymiary i pozycja okna z prośbą mogą zostać obliczone nieprawidłowo.
Aplikacje powinny zawsze wysyłać prośby o uprawnienia z aktywności, które pozostają widoczne, dopóki użytkownik nie podejmie decyzji dotyczącej uprawnień.
Zaokrąglone narożniki
Aktywność może być przezroczysta ze względu na styl, który 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ń wyświetlania, system automatycznie stosuje zaokrąglone rogi w przypadku aktywności, która została skonfigurowana przez producenta urządzenia. Jeśli jednak przezroczysta aktywność (np. okno dialogowe z prośbą o uprawnienia) nie wypełnia dostępnej przestrzeni, możesz zdecydować, czy chcesz zastosować zaokrąglone rogi.
Okna dialogowe z prośbą o zezwolenie nie wypełniają dostępnej przestrzeni wyświetlania, ponieważ układ okna dialogowego zwykle używa LayoutParams.WRAP_CONTENT zamiast LayoutParams.MATCH_PARENT.

Okno dialogowe z zaokrąglonymi rogami prawidłowo umieszczone nad widoczną aktywnością uruchamiania.
Obejście problemu ze zgodnością
Zachowaj widoczność działań, które uruchamiają działania okna dialogowego, dopóki użytkownik nie odpowie na okno dialogowe.
System dba o to, aby przezroczysta aktywność dziedziczyła wszystkie ograniczenia pierwszej nieprzezroczystej aktywności znajdującej się pod nią na stosie aktywności, w tym ograniczenia związane z:
- Tryb zgodności rozmiaru
- Orientacja
- Format obrazu
Gry Unity
Gry Unity działają na Androidzie w trybie pełnoekranowym lub w trybie wielu okien. Jednak wiele gier na platformie Unity traci fokus i przestaje renderować treści, gdy aplikacja jest w trybie wielu okien.
Problem
W wersji 2019.4 silnika Unity dodano opcję Resizable Window
, która umożliwia obsługę trybu wielu okien na Androidzie. Jednak początkowa implementacja nie reagowała prawidłowo na cykl życia aktywności w trybie wielu okien, co powodowało zawieszanie odtwarzania przez UnityPlayer, gdy aplikacja traciła fokus. Odtwarzacz wyświetlił czarny ekran lub ostatnią, zamrożoną klatkę gry. Rozgrywka jest wznawiana tylko wtedy, gdy użytkownik dotknie ekranu. Wiele aplikacji korzystających z silnika Unity ma ten problem i w trybie wielu okien wyświetla się jako czarne okno.

Gra traci fokus w trybie wielu okien i jest renderowana jako czarne okno.
Optymalizacja
Uaktualnij silnik Unity do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. W ustawieniach odtwarzacza na Androida pozostaw zaznaczoną opcję
Resizable Window
. W przeciwnym razie gra będzie się zatrzymywać, gdy nie będzie aktywna, nawet jeśli będzie w całości widoczna w trybie wielu okien.

Gra prawidłowo renderuje treści w trybie wielu okien, nawet gdy nie jest aktywna.
Obejście problemu ze zgodnością
Producenci urządzeń mogą zastosować zastąpienie OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
dla poszczególnych aplikacji, aby przekazać fałszywe zdarzenie skupienia do aplikacji w trybie wielu okien. Zastąpienie umożliwia aktywności ponowne narysowanie treści i zapobiega jej zaciemnieniu.
Tryb okien na pulpicie
Gdy aplikacje działają w środowisku okien na pulpicie, mogą napotkać dodatkowe tryby zgodności.
Aplikacje z zablokowaną orientacją można dowolnie zmieniać. Nawet jeśli aktywność jest zablokowana w orientacji pionowej, użytkownicy mogą zmienić rozmiar aplikacji na orientację poziomą.

Aplikacje z zablokowaną orientacją można nadal dowolnie zmieniać.
Jeśli jednak aktywność jest zadeklarowana jako niemożliwa do zmiany rozmiaru (resizeableActivity = false), interfejs aktywności jest skalowany przy zachowaniu tego samego współczynnika proporcji.

Interfejs działań zadeklarowanych jako niemożliwe do zmiany rozmiaru jest skalowany.
Podgląd z kamery w oknie na komputerze
Gdy aplikacje w oknach na komputerze uruchamiają podgląd z kamery, interfejs wizjera jest skalowany przy zachowaniu pierwotnego współczynnika proporcji. Pozostałą część okna aplikacji można dowolnie zmieniać.

Zmiana 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 urządzeniach, skorzystaj z tych materiałów:
- Streaming na urządzeniach: aby testować aplikację na urządzeniach produkcyjnych (w tym urządzeniach referencyjnych) hostowanych w centrach danych Google, zapoznaj się z artykułem Streaming na urządzeniach z Androidem obsługiwany przez Firebase .
- Emulatory w Android Studio: informacje o tworzeniu emulatorów urządzeń referencyjnych znajdziesz w artykule Tworzenie wirtualnych urządzeń i zarządzanie nimi.
- Emulator z możliwością zmiany rozmiaru w Android Studio: 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 korzystać z całej przestrzeni wyświetlania dostępnej dla aplikacji. Najpierw zadeklaruj w folderze testowym ten 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 uruchom test, aby potwierdzić działanie i upewnić się, że aktywność docelowa nie jest wyświetlana w formacie letterbox:
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(activity.isLetterboxed()); }); } }
Najlepiej przeprowadzaj ten rodzaj testu tylko do momentu, gdy zakończy się on powodzeniem i potwierdzi, że aktywności aplikacji zajmują całą przestrzeń wyświetlania dostępną dla aplikacji. Testuj 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 działanie aplikacji. Na przykład zastąpienie FORCE_RESIZE_APP
nakazuje systemowi pominięcie trybu zgodności rozmiaru i dopasowanie rozmiaru aplikacji do wymiarów wyświetlacza, nawet jeśli w manifeście aplikacji określono resizeableActivity="false"
.
Producenci urządzeń stosują zastąpienia w przypadku wybranych aplikacji lub wszystkich aplikacji na konkretnych urządzeniach z dużym ekranem. Na Androidzie 14 (API na poziomie 34) i nowszym użytkownicy mogą stosować zastąpienia w aplikacjach za pomocą ustawień urządzenia. Na Androidzie 16 (poziom interfejsu API 36) i nowszym właściciele urządzeń wirtualnych stosują zastąpienia na wybranych urządzeniach, którymi zarządzają.
Zastępowanie ustawień poszczególnych aplikacji przez użytkowników
W Androidzie 14 i nowszych użytkownicy mogą zmieniać proporcje 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 proporcje na 3:4, 1:1, pełny ekran lub inną wartość skonfigurowaną przez producenta urządzenia. Użytkownicy mogą też przywrócić domyślne ustawienie proporcji obrazu, które jest określone w pliku manifestu aplikacji.
Aplikacje mogą zrezygnować z zastępowania zgodności, ustawiając te tagi PackageManager.Property
:
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
Aby zrezygnować z zastępowania zgodności z formatem obrazu użytkownika, dodaj do pliku manifestu aplikacji właściwość 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 zastąpić formatu obrazu aplikacji.
Ustawienie 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 zastępowania zgodności z formatem obrazu użytkownika, dodaj właściwość do pliku manifestu aplikacji i ustaw wartość
false
:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
Opcja pełnoekranowa zostanie usunięta z listy opcji formatu obrazu w ustawieniach urządzenia. Użytkownicy nie będą mogli zastosować zastąpienia pełnoekranowego w przypadku Twojej aplikacji.
Ustawienie tej właściwości na
true
nie ma żadnego efektu.
Zoptymalizuj aplikację pod kątem wszystkich ekranów: nie ustawiaj w aplikacji ograniczeń dotyczących współczynnika proporcji. Używaj klas rozmiaru okna, aby obsługiwać różne układy w zależności od ilości dostępnego miejsca na ekranie.
Zastąpienia ustawień aplikacji na urządzeniu
Producenci urządzeń i właściciele urządzeń wirtualnych (wybrane zaufane i uprzywilejowane aplikacje) stosują zastąpienia w przypadku poszczególnych aplikacji na konkretnych urządzeniach, w tym na tabletach, urządzeniach składanych, urządzeniach z ChromeOS i wyświetlaczach samochodowych. Urządzenia referencyjne mogą domyślnie stosować niektóre zastąpienia w różnych aplikacjach.
Aplikacje mogą zrezygnować z większości zastąpień (patrz tabela Zastąpienia w przypadku poszczególnych aplikacji poniżej).
Aplikację możesz przetestować z włączonymi lub wyłączonymi zastąpieniami za pomocą platformy zgodności (patrz Narzędzia platformy zgodności). Gdy ta opcja jest włączona, zastąpienia obowiązują w 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 z nich 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>
W tabeli poniżej znajdziesz listę dostępnych zastąpień wraz z wskazówkami dotyczącymi optymalizacji aplikacji, aby nie musiała ona korzystać z tych zastąpień. Możesz dodać do manifestu aplikacji flagi właściwości, aby zrezygnować z niektórych zastąpień.
Zastąpienia na poziomie aplikacji | |||
---|---|---|---|
Typ | Nazwa | ID | Opis |
Możliwość zmiany rozmiaru | FORCE_RESIZE_APP | 174042936 | Omija tryb zgodności rozmiaru w przypadku aplikacji podczas zmian konfiguracji. |
FORCE_NON_RESIZE_APP | 181136395 | Wymusza tryb zgodności rozmiaru aplikacji w przypadku zmian konfiguracji. | |
Format obrazu | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Przełącznik, który musi być włączony, aby można było 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 aktywności tylko w trybie pionowym. | |
OVERRIDE_MIN_ASPECT_RATIO_SMALL | 349045028 | Zmienia minimalny format obrazu na 4:3. | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | Zmienia minimalny format obrazu na 3:2. | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | Zmienia minimalny format obrazu na 16:9. | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | Zmienia minimalny format obrazu, aby dopasować go do 50% rozmiaru wyświetlacza (lub formatu podzielonego ekranu). | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | Wyłącza zastępowanie minimalnego współczynnika proporcji, dzięki czemu aplikacje są wyświetlane na pełnym ekranie, gdy urządzenie jest w orientacji pionowej. | |
Orientacja | OVERRIDE_ANY_ORIENTATION | 265464455 | Umożliwia zastąpienie dowolnej orientacji. |
OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | Zastępuje ograniczenia dotyczące orientacji, możliwości zmiany rozmiaru i formatu obrazu. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | Zastępuje orientację pionową, gdy aktywność ma niezdefiniowaną orientację. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | Zastępuje orientację wartością nosensor (użyj naturalnej orientacji urządzenia), gdy aktywność ma niezdefiniowaną orientację. |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | Obraca aplikacje działające tylko w trybie poziomym o 180 stopni. | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | Ogranicza zakres zastępowania orientacji do sytuacji, w których aplikacja jest połączona z kamerą. | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | Ustawia wyświetlacz w stałej orientacji poziomej, gdy zadanie jest wyświetlane na pełnym ekranie (również w przypadku letterboxingu). | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Ignoruje żądania dotyczące orientacji wysyłane przez aplikację, 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 sekundy prosi o co najmniej 2 nowe orientacje, system uzna to za nieskończoną pętlę obracania i zastosuje zastąpienie. | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | Zapobiega letterboxingowi przez wyłączenie ustawienia producenta urządzenia, które ignoruje żądanie orientacji. | |
Interfejsy API piaskownicy | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Zapobiega zmianie działania dowolnych interfejsów API wyświetlania. |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Wymusza zwracanie przez interfejsy API Display w aplikacji granic aplikacji. Display Interfejsy API 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. |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Wymusza zwracanie przez View interfejsy API używane w aplikacji granic aplikacji. View Interfejsy API 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. |
|
Kompatybilność z aparatem | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Wyłącza wymuszoną rotację. Domyślnie wszystkie aplikacje aparatu o stałej orientacji są obracane siłowo, gdy otwarty jest podgląd z kamery. |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | Usuwa domyślne odświeżanie, które jest stosowane, gdy podgląd z kamery jest obracany. | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Przełącza odświeżanie twarde na odświeżanie miękkie, gdy podgląd z kamery jest obracany siłowo, co pomaga zachować stan podczas obracania. Domyślnie Android stosuje pełne odświeżanie, gdy podgląd z kamery jest obracany. Twarde odświeżanie może powodować problemy z utratą stanu lub zaciemnieniem aplikacji w zależności od tego, jak aplikacje buforowały poprzedni stan. | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Przycina bufor obrazu wewnętrznego aparatu przedniego. Jeśli zastąpienie jest wyłączone, przycinanie wewnętrznego przedniego aparatu zostanie usunięte, a pole widzenia podglądu aparatu zostanie zwiększone. Na niektórych urządzeniach składanych (patrz urządzenia referencyjne) system domyślnie przycina podgląd z kamery we wszystkich aplikacjach do obsługi aparatu, gdy używana jest wewnętrzna kamera przednia. | |
Różne | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Zapobiega zaciemnianiu aplikacji, gdy traci ona fokus w trybie podzielonego ekranu. Aplikacja czeka na fokus, zanim narysuje swoją zawartość, co może spowodować jej zawieszenie lub zaciemnienie. Zastąpienie umożliwia systemowi Android wysłanie do aplikacji fałszywego zdarzenia fokusu, które sygnalizuje aplikacji, że ma ponownie zacząć rysować treści. |
FORCE_RESIZE_APP
Wymusza zmianę rozmiaru pakietów, do których zastosowano zastąpienie, i umożliwia im przejście do trybu wielu okien. Dotyczy wszystkich rozmiarów wyświetlaczy.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
W pliku manifestu aplikacji ustaw atrybut android:resizeableActivity
na true
.
Optymalizacja aplikacji
Używaj układów elastycznych/adaptacyjnych, aby umożliwić aplikacjom dostosowywanie się do wszystkich rozmiarów wyświetlacza i współczynników proporcji. Zobacz Obsługa różnych rozmiarów ekranów.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
FORCE_NON_RESIZE_APP
Wymusza, aby pakiety, do których zastosowano zastąpienie, nie mogły zmieniać rozmiaru i w przypadku zmian konfiguracji przechodziły w tryb zgodności rozmiarów. Dotyczy wszystkich rozmiarów wyświetlacza.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Ustaw w manifeście aplikacji zarówno atrybut android:resizeableActivity
, jak i flagę metadanych android.supports_size_changes
na wartość false
oraz zadeklaruj ograniczenie orientacji lub formatu obrazu.
Optymalizacja aplikacji
Wszystkie aplikacje, które dobrze działają po zmianie rozmiaru, powinny mieć ustawioną wartość android:resizeableActivity
lub android.supports_size_changes
na true
.
Inne aplikacje należy ulepszyć, aby dobrze działały po zmianie rozmiaru. Zobacz android:resizeableActivity.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO
Jest to mechanizm kontrolny wszystkich zastąpień, które wymuszają określony minimalny format obrazu.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Ustaw android:minAspectRatio
na poziomie aktywności lub aplikacji.
Optymalizacja aplikacji
Nie ustawiaj w aplikacji ograniczeń dotyczących proporcji. Upewnij się, że obsługuje ona różne rozmiary wyświetlacza. Używaj klas rozmiaru okna, aby obsługiwać różne układy w zależności od ilości miejsca, jaką aplikacja ma na ekranie. Zobacz interfejs API WindowSizeClass
Compose i interfejs API WindowSizeClass
View.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Określ ograniczenie współczynnika proporcji lub ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
Ogranicza ustawienia aplikacji, które wymuszają określony minimalny współczynnik proporcji w przypadku działań w orientacji pionowej. Domyślnie jest włączona i działa tylko wtedy, gdy jest też włączona zasada OVERRIDE_MIN_ASPECT_RATIO
.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_SMALL
Ustawia minimalny współczynnik proporcji aktywności na małą wartość (4:3).
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
Ustawia minimalny format obrazu aktywności na średnią wartość (3:2).
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do testowania zastępowania,
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: 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 rezultat co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
Umożliwia korzystanie ze współczynnika proporcji podzielonego ekranu. Umożliwia aplikacji korzystanie z całej dostępnej przestrzeni w trybie podzielonego ekranu, unikając efektu letterboxingu.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
Wyłącza zastępowanie minimalnego formatu obrazu w trybie pełnoekranowym w orientacji pionowej, aby wykorzystać całą dostępną przestrzeń ekranu.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ANY_ORIENTATION
Włącza te zastąpienia, aby zastąpić dowolną orientację:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Ustaw atrybut 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: pozwolić systemowi zniszczyć i ponownie utworzyć aplikację lub samodzielnie zarządzać zmianami konfiguracji. Jeśli samodzielnie zarządzasz zmianami konfiguracji, stan aplikacji można zachować za pomocą ViewModel
. W bardzo ograniczonych przypadkach możesz zdecydować się na zablokowanie orientacji tylko na małych wyświetlaczach, chociaż takie rozwiązanie może nie być tak skalowalne, jak umożliwienie użytkownikowi obracania aplikacji w razie potrzeby. W Androidzie 12L i nowszych wersjach stałą orientację można zastąpić konfiguracją urządzenia. Więcej informacji o obsłudze zmian konfiguracji i wszystkich orientacji znajdziesz w artykułach Obsługa zmian konfiguracji, Omówienie ViewModel i Orientacja aplikacji ograniczona na telefonach, ale nie na urządzeniach z dużym ekranem.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ANY_ORIENTATION_TO_USER
Umożliwia aplikacji wypełnienie dostępnego miejsca na wyświetlaczu. Zastępuje wszelkie ograniczenia dotyczące orientacji, zmiany rozmiaru i proporcji obrazu określone w pliku manifestu aplikacji. Ignoruje też połączenia na numery Activity#setRequestedOrientation()
i Activity#getRequestedOrientation()
.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Nie ustawiaj atrybutu
android:screenOrientation
manifestu lub ustaw go na"user"
.Ustaw atrybut
android:resizeableActivity
w pliku manifestu natrue
.Na małych ekranach, aby obsługiwać zmianę rozmiaru aplikacji przy jednoczesnym wyłączeniu trybu wielu okien za pomocą
android:resizeableActivity=false
, ustaw flagę metadanychandroid.supports_size_changes
natrue
. Nie ustawiaj wartościminAspectRatio
imaxAspectRatio
.
Optymalizacja aplikacji
Włącz obsługę wszystkich orientacji w aplikacji. Nie ustawiaj specyfikacji w pliku manifestu aplikacji.screenOrientation
Aby aplikacja obsługiwała zmianę rozmiaru, tryb wielu okien i wszystkie proporcje ekranu, ustaw atrybut android:resizeableActivity
w pliku manifestu aplikacji na true
. Zobacz Obsługa różnych rozmiarów ekranów.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
polecenia adb do testowania zastępowania,
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: 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 żadnej innej stałej orientacji.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
Włącza orientację nosensor dla wszystkich aktywności w pakiecie. Jeśli nie jest włączona wartość OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa innej stałej orientacji.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
polecenia adb do testowania zastępowania,
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: 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 jest włączona wartość OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa innej stałej orientacji.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
polecenia adb do testowania zastępowania,
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: 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 działają tylko wtedy, gdy połączenie z aparatem jest aktywne.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usługi do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
Ogranicza orientację wyświetlacza do naturalnej orientacji poziomej, gdy spełnione są te warunki:
- Aktywność jest wyświetlana na pełnym ekranie
- Właściwość komponentu wyłączania
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
nie jest włączona - Dla wyświetlacza włączone jest ustawienie ignorowania żądania orientacji przez producenta urządzenia.
- Naturalna orientacja wyświetlacza to pozioma.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Nie dotyczy. Problem należy rozwiązać w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
Włącza zasadę zgodności, która pomija aktualizowanie orientacji aplikacji w odpowiedzi na wywołanie przez nią funkcji Activity#setRequestedOrientation()
, gdy aplikacja jest ponownie uruchamiana lub ma aktywne działanie związane ze zgodnością z aparatem.
Jak aplikacje mogą osiągnąć ten sam rezultat 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ć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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: 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 przez nią funkcji Activity#setRequestedOrientation()
więcej niż 2 razy w ciągu sekundy, jeśli aktywność nie jest wyświetlana w formacie letterbox dla stałej orientacji.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Nie dotyczy. Problem należy rozwiązać w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
na false
.
Flagi usługi 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ępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
Wyklucza pakiety z zachowania ignorowania prośby o orientację, które mogą być włączone przez producentów urządzeń dla obszaru wyświetlania lub całego wyświetlacza.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Nie dotyczy. Problem należy rozwiązać w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Nie ma możliwości rezygnacji. Wyłączenie zastępowania może być niebezpieczne, jeśli aplikacja nie jest zgodna z urządzeniem, na którym włączono ustawienie „Ignoruj prośbę producenta urządzenia o określenie orientacji”. Aby wyłączyć zastąpienie, skontaktuj się z zespołem ds. relacji z deweloperami Androida.
Flagi usługi do dostosowania zastępowania
Brak flag usługi w przypadku tego zastąpienia.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
NEVER_SANDBOX_DISPLAY_APIS
Wymusza, aby w przypadku aktywności w trybie zgodności z rozmiarem lub trybie letterbox pakiety nigdy nie miały zastosowanego Display
piaskownicy interfejsu API. Interfejsy Display
API nadal podają granice obszaru wyświetlania.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zadeklaruj, że rozmiar aktywności można zmieniać, ustawiając atrybut manifestu android:resizeableActivity
na true
lub flagę metadanych android.supports_size_changes
na true
.
Optymalizacja aplikacji
Aplikacje, które deklarują, że można w pełni zmieniać ich rozmiar, nigdy nie powinny polegać na rozmiarze wyświetlacza przy pozycjonowaniu elementów interfejsu. Przenieś aplikację na aktualne interfejsy API, które zapewniają WindowMetrics
. Jeśli używasz Jetpack Compose, skorzystaj z interfejsu API WindowSizeClass
, aby rysować interfejs na podstawie tego, ile miejsca na ekranie zajmuje aplikacja na bieżącym wyświetlaczu. Zobacz Korzystanie z klas rozmiarów okien.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Nie ma możliwości rezygnacji. Przejdź z wycofanych interfejsów API.
Flagi usługi do dostosowania zastępowania
Brak flag usługi w przypadku tego zastąpienia.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
ALWAYS_SANDBOX_DISPLAY_APIS
Wymusza stosowanie piaskownicy interfejsu API Display
w przypadku pakietów niezależnie od trybu okienkowego. Interfejsy API Display
zawsze podają granice aplikacji.
Jak aplikacje mogą osiągnąć ten sam rezultat 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 w pełni zmieniać ich rozmiar, nigdy nie powinny polegać na rozmiarze wyświetlacza przy pozycjonowaniu elementów interfejsu. Przenieś aplikację z wycofanych interfejsów API na aktualne interfejsy API, które zapewniają WindowMetrics
. Zobacz WindowMetricsCalculator
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Nie ma możliwości rezygnacji. Przejdź z wycofanych interfejsów API.
Flagi usługi do dostosowania zastępowania
Brak flag usługi w przypadku tego zastąpienia.
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
Wymusza umieszczenie pakietów w piaskownicy w przypadku tych interfejsów API View
w granicach aktywności:
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Rozwiąż problem w kodzie aplikacji, używając interfejsów API, które podają granice okna aplikacji i przesunięcia względem okna aplikacji, a nie granice wyświetlacza urządzenia i przesunięcia względem wyświetlacza urządzenia.
Optymalizacja aplikacji
Aplikacje powinny korzystać z interfejsów API View
, biorąc pod uwagę możliwość zastosowania do nich efektu letterbox i trybu wielu okien. Więcej informacji znajdziesz w sekcji WindowMetricsCalculator
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
Wyłącza wymuszoną rotację. Poprawia komfort korzystania z niektórych aplikacji.
Jak aplikacje mogą osiągnąć ten sam rezultat 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 na informacjach o urządzeniu. Wskazówki dotyczące zgodności z aparatem znajdziesz w artykułach Wprowadzenie do wizjera aparatu i Obsługa powierzchni o zmiennej wielkości w aplikacji aparatu.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
na true
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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 wymuszenie rotacji:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Uwaga: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
Wyłącza odświeżanie aktywności po wymuszeniu obrotu. Poprawia wygodę użytkowników, gdy odświeżanie powoduje utratę stanu w aplikacjach.
Jak aplikacje mogą osiągnąć ten sam rezultat 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ć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
na true
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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: 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ść za pomocą cyklu onResume()
→ onPause()
→ onResume()
, a nie onResume()
→ onStop()
→ onResume()
po wymuszeniu obrotu ze względu na zgodność z aparatem.
Jak aplikacje mogą osiągnąć ten sam rezultat 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ć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
na false
.
Flagi usługi 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ępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
Wymusza przycięcie obrazu z aparatu do orientacji przeciwnej, gdy orientacja pionowa 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 rezultat 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ć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
Aby zastosować zastąpienie, które powoduje przycięcie obrazu z wewnętrznego aparatu przedniego:
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Aby usunąć zastąpienie, które powoduje usunięcie przycinania wewnętrznego aparatu przedniego:
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Uwaga: 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 niewłaściwie używają interfejsu API createConfigForDefaultDisplay()
, aby wymuszać przechwytywanie pełnoekranowe i zagrażać prywatności użytkowników przez ujawnianie treści powiadomień, które są przechwytywane w trybie pełnoekranowym, ale nie w trybie udostępniania ekranu aplikacji, oraz wszystkich aplikacji niezależnie od trybu okienkowego.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Zezwól na domyślne działanie projekcji multimediów (zastosowane w Androidzie 14, API na poziomie 34, z createScreenCaptureIntent()
), które umożliwia użytkownikom decydowanie, czy udostępnić cały ekran, czy okno pojedynczej aplikacji, niezależnie od trybu okienkowego. Możesz też zadzwonić pod numer createScreenCaptureIntent(MediaProjectionConfig)
, podając argument MediaProjectionConfig
zwrócony przez wywołanie funkcji createConfigForUserChoice()
.
Optymalizacja aplikacji
Umożliwia użytkownikom wybór, czy podczas projekcji multimediów udostępnić cały ekran urządzenia, czy okno aplikacji. Od Androida 14 jest to domyślne działanie.
Umożliwiaj zmianę rozmiaru aplikacji (resizeableActivity="true"
), aby obsługiwała tryb wielu okien.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ze względu na powagę kwestii prywatności użytkowników Twoja aplikacja nie może wyłączyć ani zrezygnować z tego zastąpienia.
Flagi usługi do dostosowania zastępowania
Brak.
polecenia adb do testowania zastępowania,
Aby zastosować zastąpienie, które anuluje rezygnację aplikacji z udostępniania części ekranu (czyli włącza udostępnianie części ekranu):
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
Umożliwia wysyłanie fałszywego fokusu do aplikacji, które nie są aktywne w trybie podzielonego ekranu. Niektóre silniki gier czekają na uzyskanie fokusu, zanim narysują zawartość aplikacji. Dlatego fałszywy fokus pomaga aplikacjom uniknąć pozostawania w stanie wygaszonym po wznowieniu, gdy jeszcze nie mają fokusu.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na true
.
Optymalizacja aplikacji
Możesz uniknąć tego problemu, jeśli Twoja aplikacja dobrze obsługuje wiele orientacji i zmiany konfiguracji. Przygotuj aplikację na duże ekrany, postępując zgodnie z wytycznymi dotyczącymi jakości aplikacji na duże ekrany.
Jeśli korzystasz z silnika Unity, uaktualnij go do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. W ustawieniach odtwarzacza Android pozostaw zaznaczoną opcję Resizable Window (Okno o zmiennym rozmiarze).
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na false
.
Flagi usługi do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
polecenia adb do testowania zastępowania,
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: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS
Gdy zastępowanie jest włączone, aktywność otrzymuje konfigurację wraz z wstawkami paska tytułu. Zwykle wcięcia paska tytułu są odłączone od konfiguracji.
Jak aplikacje mogą osiągnąć ten sam rezultat co zastąpienie
Włącz wyświetlanie bez ramki lub zaktualizuj docelowy pakiet SDK aplikacji do interfejsu API na poziomie 35 lub wyższym. Zobacz:
- Tworzenie: Informacje o wcięciach w oknie
- Widoki: Wyświetlanie treści od krawędzi do krawędzi w widokach
- Konfiguracja: Zmiany w działaniu: aplikacje kierowane na Androida 15 lub nowszego
Optymalizacja aplikacji
Możesz uniknąć tego problemu, jeśli Twoja aplikacja obsługuje wyświetlanie od krawędzi do krawędzi lub jest kierowana na interfejs API na poziomie 35 lub wyższym.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Włącz wyświetlanie bez ramki lub kieruj aplikację na interfejs API na poziomie 35 lub wyższym.
Flagi usługi do dostosowania zastępowania
Brak.
polecenia adb do testowania zastępowania,
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS <package>
Uwaga: 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 aplikacja z podwyższonymi uprawnieniami, która zarządza urządzeniem wirtualnym. Właściciele urządzeń wirtualnych tworzą je, aby renderować aplikacje, a następnie wyświetlać je na urządzeniach zdalnych, takich jak komputery osobiste, urządzenia wirtualnej rzeczywistości czy systemy informacyjno-rozrywkowe w samochodach. Właściciel urządzenia wirtualnego korzysta z urządzenia lokalnego, np. telefonu. ↩