Tryb zgodności urządzenia

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ą:

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ą, że ROTATION_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ą elementu Activity#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 parametr resizeableActivity ma wartość false, mogą ustawić parametr maxAspectRatio.

  • minAspectRatio: określa minimalny współczynnik proporcji obsługiwany przez aplikację. Tylko aplikacje, w których parametr resizeableActivity ma wartość false, mogą ustawić parametr minAspectRatio.

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.

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:

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.

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 ekranuObsługa trybu wielu 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.

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ę.

Optymalizacja

Aplikacje nie powinny wykonywać tych czynności:

  • Ustaw domyślną orientację za pomocą metody Activity#setRequestedOrientation() w aktywności onCreate(), 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.

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

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.

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 aparatuWprowadzenie do wizjera aparatu.

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.

    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.

  • 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()onStart() (domyślnie) lub onPause()onResume() (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:

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

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 DisplayOVERRIDE_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.

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.

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.

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.

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ą.

Animacja przedstawiająca zmianę rozmiaru aplikacji z orientacji pionowej na poziomą.

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.

Animacja przedstawiająca zmianę rozmiaru aplikacji. Interfejs skaluje się, aby wypełnić okno pulpitu.

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ć.

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:

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ę:

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 ViewModelOrientacja 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()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 na true.

  • Na małych ekranach, aby obsługiwać zmianę rozmiaru aplikacji przy jednoczesnym wyłączeniu trybu wielu okien za pomocą android:resizeableActivity=false, ustaw flagę metadanych android.supports_size_changes na true. Nie ustawiaj wartości minAspectRatiomaxAspectRatio.

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 aparatuObsł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:

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


  1. 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.