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, składanych telefonach z klapką i w środowiskach komputerowych, 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 jej układu lub zapobiegania jej awariom 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 interfejs API na poziomie 36 te zastąpienia na poziomie aplikacji nie działają:

Zrezygnuj

Twoja aplikacja może być kierowana na interfejs API na poziomie 36, ale nie musi korzystać z funkcji 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 interfejsu API na poziomie 36, zadeklaruj właściwość manifestu PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY.

Aby zrezygnować z konkretnego działania, ustaw właściwość w elemencie <activity>:

<activity ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</activity>

Aby zrezygnować z tej funkcji w całej aplikacji, ustaw właściwość w elemencie <application>:

<application ...>
    <property
        android:name="android.window.PROPERTY_COMPAT_ALLOW_RESTRICTED_RESIZABILITY"
        android:value="true" />
    ...
</application>

Jeśli aplikacja jest kierowana na Androida 16 (poziom API 36) lub nowszego, ta właściwość nie blokuje orientacji wyświetlacza ani nie zapobiega obracaniu ekranu na dużych wyświetlaczach.

Urządzenia referencyjne

Te urządzenia mogą wymagać zastąpień dla poszczególnych aplikacji ze względu na nietypowe konfiguracje lub konfiguracje, które nie są dobrze obsługiwane przez aplikacje:

  • Tablety: niektóre tablety, np. Pixel Tablet, są domyślnie używane w orientacji poziomej. Urządzenie jest w orientacji naturalnej, gdy Display#getRotation() zwraca Surface.ROTATION_0. Jeśli aplikacje zakładają, że ROTATION_0 jest w orientacji pionowej, układy aplikacji i podgląd z aparatu mogą nie pasować do wyświetlacza urządzenia.
  • Składane urządzenia w orientacji poziomej: niektóre urządzenia składane, takie jak Pixel Fold, są w orientacji pionowej po złożeniu, ale w orientacji poziomej po rozłożeniu. Jeśli aplikacje zakładają, że orientacja po rozłożeniu jest pionowa, prawdopodobnie wystąpią pętle migotania 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 wyświetlacz w orientacji poziomej. Aplikacje muszą rozpoznawać i uwzględniać różne orientacje wyświetlaczy.
  • Wyświetlacze zewnętrzne: wybrane urządzenia mogą rozpoczynać sesję trybu 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 i rozdzielczość ekranu. W przeciwnym razie mogą przyjmować nieprawidłowe 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 do używania na postoju na wyświetlacze samochodowe jest podobne do tworzenia aplikacji na tablety.

Typowe problemy ze zgodnością

Problemy ze zgodnością wrażeń użytkownika aplikacji najczęściej wynikają z ograniczeń dotyczących orientacji aplikacji, możliwości zmiany rozmiaru i formatu obrazu, nieprawidłowej obsługi orientacji podglądu z aparatu oraz niewłaściwego użycia interfejsów API.

Letterboxing

W trybie letterbox aplikacja jest umieszczana na środku ekranu lub, na dużych ekranach, po jednej lub drugiej stronie, aby zapewnić wygodny dostęp. Maty (jednokolorowe paski lub rozmyta tapeta) wypełniają niewykorzystany obszar wyświetlania po bokach lub u góry i u dołu aplikacji.

Pillarboxing często występuje na urządzeniach z dużym ekranem, ponieważ wymiary i format obrazu wyświetlacza urządzenia zwykle różnią się od wymiarów i formatu obrazu standardowych telefonów, na które jest przeznaczona 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 format obrazu lub nie można zmienić jej rozmiaru.

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ą Activity#setRequestedOrientation().

  • resizeableActivity: wskazuje, czy system może zmieniać rozmiar aplikacji, aby dopasować je do okien o różnych wymiarach. Na Androidzie 11 (poziom interfejsu API 30) i starszych określa, czy aplikacje obsługują tryb wielu okien. Na Androidzie 12 (API na poziomie 31) i nowszych określa, czy aplikacje obsługują tryb wielu okien na małych ekranach (kompaktowa klasa rozmiaru okna). Na Androidzie 12 i nowszych aplikacje obsługują tryb wielu okien na dużych ekranach (klasa rozmiaru okna średnia lub rozszerzona) niezależnie od tego ustawienia.

  • maxAspectRatio: określa maksymalny format obrazu obsługiwany przez aplikację. Atrybut maxAspectRatio można ustawić tylko w aplikacjach, w których atrybut resizeableActivity ma wartość false.

  • minAspectRatio: określa minimalny format obrazu obsługiwany przez aplikację. Atrybut minAspectRatio mogą ustawić tylko aplikacje, w których atrybut resizeableActivity ma wartość false.

Optymalizacja

Aplikacja powinna obsługiwać wszystkie orientacje i rozmiary wyświetlania na urządzeniach oraz w trybie wielu okien. Usuń wszystkie ograniczenia dotyczące orientacji i stałego formatu obrazu z układów aplikacji i pliku manifestu aplikacji.

Obejście problemu ze zgodnością

Jeśli aplikacja ze stałą orientacją lub stałym formatem obrazu działa w oknie, w którym nie obsługuje bezpośrednio rozmiaru lub orientacji, Android wyświetla ją w formacie letterbox, aby zachować ciągłość.

Począwszy od Androida 12 (poziom interfejsu API 31) i kontynuując w wersji 12L (poziom interfejsu API 32), platforma stosuje różne ulepszenia w aplikacjach wyświetlanych w formacie letterbox. Ulepszenia interfejsu są wdrażane przez producentów urządzeń. Nie musisz wprowadzać żadnych dodatkowych zmian w aplikacji, aby korzystać z tych ulepszeń.

W Androidzie 12 (API na poziomie 31) wprowadzono te ulepszenia estetyczne, które mogą być konfigurowane przez producentów urządzeń:

  • Zaokrąglone rogi: rogi okna aplikacji mają bardziej dopracowany wygląd.
  • Przezroczystość pasków systemu: paski stanu i paski nawigacji, które nakładają się na aplikację, są półprzezroczyste, dzięki czemu ikony na paskach są zawsze widoczne na tle letterbox.
  • Konfigurowalny format obrazu: format obrazu aplikacji można dostosować, aby poprawić jej wygląd.

Rysunek 2. Aplikacja w formacie letterbox z ulepszeniami interfejsu.

Wersja 12L (poziom interfejsu API 32) wprowadza te ulepszenia funkcjonalne:

  • Konfigurowalne pozycjonowanie: na dużych ekranach producenci urządzeń mogą umieścić 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 w trybie podzielonego ekranu:

Rysunek 3. Aplikacja w formacie letterbox z oknem z informacjami dla użytkownika.

Tryb zgodności rozmiaru

Tryb zgodności rozmiaru to letterboxing, który zachowuje format obrazu aplikacji i zawiera element sterujący ponownym uruchomieniem. 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 zmienić. Gdy aktywność zostanie przeniesiona do kontenera wyświetlania, który jest niezgodny z jej wymiarami, system może przeskalować aplikację, aby wypełniła wyświetlacz urządzenia w co najmniej jednym wymiarze.

Zmiany konfiguracji urządzenia, które mogą aktywować tryb zgodności rozmiaru, to m.in.:

  • Obracanie urządzenia
  • Składanie lub rozkładanie urządzenia składanego
  • Przełączanie między trybami wyświetlania na pełnym i podzielonym ekranie

Problem

Tryb zgodności rozmiaru zwykle dotyczy aktywności, które mają ograniczoną orientację lub format obrazu i są skonfigurowane (lub określone przez system) jako takie, których rozmiaru nie można zmienić.

Aplikacja jest uznawana za taką, której rozmiar można zmienić, i nie zostanie umieszczona w trybie zgodności rozmiaru, jeśli spełnia dowolne z tych kryteriów:

Jeśli aplikacja nie spełnia żadnego z tych warunków, jest uznawana za aplikację, której rozmiaru nie można zmienić, i może zostać umieszczona w trybie zgodności rozmiaru.

Optymalizacja

Aplikacja powinna obsługiwać wszystkie rozmiary wyświetlaczy. Ustaw atrybut android:resizeableActivity elementu <activity> lub <application> na true w manifeście aplikacji, aby umożliwić zmianę rozmiaru aplikacji. Zaprojektuj elastyczne/adaptacyjne układy aplikacji. Więcej informacji znajdziesz w artykułach Obsługa różnych rozmiarów wyświetlaczy i Obsługa trybu wielu okien.

Obejście problemu ze zgodnością

Android umieszcza aplikację w trybie zgodności rozmiaru, gdy system stwierdzi, że wyświetlanie aplikacji w formacie letterbox można poprawić, zmieniając jej rozmiar tak, aby wypełniała okno wyświetlania w co najmniej 1 wymiarze. System wyświetla opcję ponownego uruchomienia, która odtwarza proces aplikacji, aktywność i wyświetlacz. Zobacz też Omówienie procesów i wątków.

Tryb zgodności wyświetlania

Tryb zgodności wyświetlacza zapobiega ponownemu uruchamianiu aplikacji, gdy jest ona przenoszona 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ść działania. W przeciwieństwie do trybu zgodności rozmiaru tryb zgodności wyświetlania nie blokuje konfiguracji aplikacji. Aplikacja nadal może 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 elastycznie 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 żądać nowych orientacji po zmianie konfiguracji, co powoduje nieskończoną pętlę, która sprawia, że wyświetlacz migocze lub aplikacja obraca się bez końca.

Problem

Na Androidzie 12 (API na poziomie 31) i nowszych producenci urządzeń 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, aplikacja może programowo ustawić orientację, wywołując metodę 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 orientacji aplikacji są ponownie ignorowane, aplikacja powtarza wywołanie metody setRequestedOrientation(), wywołanie powoduje ponowne uruchomienie aplikacji i tak dalej w nieskończonej pętli.

Innym przypadkiem, w którym możesz się z tym spotkać, jest sytuacja, gdy naturalna orientacja (zwykła orientacja określona przez Androida) ekranu urządzenia jest pozioma (czyli wywołanie Display#getRotation() zwraca Surface.ROTATION_0, gdy urządzenie ma poziomy format obrazu). W przeszłości aplikacje zakładały, że Display.getRotation() = Surface.ROTATION_0 oznacza, że urządzenie jest w orientacji pionowej, ale nie zawsze tak jest, na przykład na ekranie wewnętrznym niektórych urządzeń składanych i na niektórych tabletach.

Aplikacja w orientacji poziomej na wewnętrznym wyświetlaczu urządzenia składanego może sprawdzić obrót ekranu, otrzymać wartość ROTATION_0, założyć, że naturalna orientacja urządzenia jest pionowa, i wywołać funkcję setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ), aby zmienić konfigurację układu aplikacji. Po ponownym uruchomieniu aplikacji (w orientacji poziomej) może ona ponownie sprawdzić obrót ekranu, otrzymać wartość ROTATION_0, wywołać setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) i kontynuować nieskończoną pętlę.

Optymalizacja

Aplikacje nie powinny:

  • Ustaw domyślną orientację za pomocą Activity#setRequestedOrientation() w metodzie 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) jest pionowa
  • Ustaw orientację 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 po poprzednim wywołaniu metody lub włączono wymuszenie obrotu w ramach zgodności z aparatem (patrz Podgląd z aparatu poniżej).

    Producenci urządzeń mogą zastosować to zachowanie do aplikacji za pomocą OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION.

  • Aktywność wysłała więcej niż 2 żądania orientacji w ciągu sekundy, co wskazuje na wystąpienie pętli. Z tych 2 żądań w pętli Android używa tego, które maksymalizuje obszar wyświetlania aplikacji.

    Producenci urządzeń mogą zastosować to zachowanie do aplikacji za pomocą 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 z aparatu (lub wizjer) w aplikacjach aparatu może być nieprawidłowo wyrównany lub zniekształcony na tabletach, laptopach i składanych wyświetlaczach.

Zobacz też Podgląd z aparatu w trybie okien na pulpicie.

Problem

W dokumencie definicji zgodności Androida jest napisane, ż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 czujnika aparatu jest pionowa – to uzasadnione 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. Ponadto 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 do obsługi aparatu muszą prawidłowo identyfikować orientację urządzenia i czujnika aparatu oraz zarządzać nią, aby wyświetlać prawidłowo wyrównany i skalowany podgląd z aparatu. Aplikacje muszą obliczać obrót urządzenia, obrót czujnika i format obrazu ekranu lub okna, a następnie stosować wyniki do podglądu z aparatu. Szczegółowe instrukcje znajdziesz w artykułach Podgląd z aparatu i Przedstawiamy wizjer 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 naturalnej orientacji urządzenia. Android dopasowuje okno aplikacji z ograniczeniem do orientacji pionowej do naturalnej orientacji urządzenia, czego oczekuje większość aplikacji. Android przycina też obraz z czujnika aparatu, gdy czujnik jest ustawiony w orientacji poziomej, a podgląd z aparatu – w pionowej. Oto konkretne obejścia:

  • Wymuszaj obracanie podglądu z aparatu w aplikacjach, które działają tylko w orientacji pionowej: aplikacje, które działają 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 nowszych aplikacje mogą działać w różnych orientacjach urządzenia, jeśli producenci urządzeń ignorują specyfikację orientacji.

    Gdy aplikacja z ograniczeniem do orientacji pionowej jest połączona z aparatem, Android wymusza obrót aplikacji, aby wyrównać okno aplikacji w orientacji pionowej z naturalną orientacją urządzenia.

    Na niektórych tabletach (patrz urządzenia referencyjne) okno aplikacji w orientacji pionowej jest obracane do pełnego ekranu w orientacji pionowej, aby dopasować je do naturalnej orientacji urządzenia. Po wymuszonym obróceniu aplikacja zajmuje cały ekran.

    Na wewnętrznym ekranie urządzeń składanych w orientacji poziomej (patrz urządzenia referencyjne) aktywności tylko w orientacji pionowej są obracane do orientacji poziomej, aby dopasować je do naturalnej orientacji rozłożonego urządzenia. Po wymuszeniu obrotu aplikacja jest wyświetlana w formacie letterbox.

  • Przycinanie obrazu z wewnętrznego aparatu przedniego: w niektórych urządzeniach składanych czujnik wewnętrznego aparatu przedniego jest ustawiony w orientacji poziomej. Oprócz wymuszonego obracania podglądu z aparatu na składanym wyświetlaczu wewnętrznym Android przycina pole widzenia wewnętrznego aparatu przedniego (w orientacji poziomej), aby czujnik rejestrował widok przeciwny do orientacji urządzenia.

  • Wymuszanie odświeżania podglądu z kamery: po wymuszonym obróceniu system przechodzi przez metody aktywności onStop() i onStart() (domyślnie) lub onPause() i onResume() (stosowane przez zastąpienie OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE w aplikacji), aby upewnić się, że podgląd z kamery jest wyświetlany prawidłowo.

  • Skalowanie formatu obrazu: system dynamicznie zmienia format obrazu wymuszonego obrotu podglądu z kamery na wyższy minimalny format obrazu, co zapewnia prawidłowe skalowanie podglądu z kamery.

Deweloperzy aplikacji mogą zastąpić te obejścia, jeśli aplikacje prawidłowo obsługują podgląd z aparatu. Zobacz Zastąpienia ustawień poszczególnych aplikacji.

Interfejsy API, które są często używane w niewłaściwy sposób

W miarę jak Android dodawał obsługę funkcji takich jak tryb wielu okien i urządzeń takich jak urządzenia składane, 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 formatach. Wycofane interfejsy API są jednak nadal dostępne, aby zapewnić zgodność wsteczną.

Niektóre interfejsy API View są przeznaczone do celów specjalnych, które nie zawsze są dobrze rozumiane przez deweloperów.

Problem

Deweloperzy nadal używają wycofanych interfejsów API Display i błędnie zakładają, że zwracają one granice aplikacji, a nie granice obszaru wyświetlania urządzenia. Może się też zdarzyć, że deweloperzy omyłkowo używają interfejsów API widoku do celów specjalnych, aby uzyskać ogólne dane dotyczące wyświetlania. W rezultacie po zmianie rozmiaru okna aplikacji elementy interfejsu są nieprawidłowo rozmieszczane, co powoduje problemy z układem.

Wycofane i często nieprawidłowo używane interfejsy API wyświetlania:

Więcej informacji znajdziesz w artykule Obsługa trybu wielu okien.

Interfejsy API widoku używane w niewłaściwy sposób:

Optymalizacja

Nigdy nie polegaj na fizycznym rozmiarze wyświetlacza przy pozycjonowaniu elementów interfejsu. Przenieś aplikację na interfejsy API oparte na WindowMetrics, w tym te interfejsy 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ły 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 do aplikacji, które kwalifikują się do trybu zgodności rozmiaru.

Przejrzyste działania

Przezroczyste aktywności są wynikiem przezroczystych stylów tła, na przykład:

<style name="Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Motywy związane z oknami dialogowymi, takie jak Theme.MaterialComponents.Dialog, mogą zawierać style, które sprawiają, że aktywności są przezroczyste.

Aktywności przezroczyste nie pokrywają całej dostępnej przestrzeni wyświetlania, co utrudnia zarządzanie nimi, 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

Przezroczysta aktywność powinna być zgodna z granicami pierwszej nieprzezroczystej aktywności poniżej przezroczystej aktywności na stosie działań zadania. Jednak nieprzezroczysta aktywność, która uruchamia okno uprawnień, może być trampoliną (aktywnością, która uruchamia inną aktywność, a następnie znika). System nie może więc określić granic aktywności trampoliny, która uruchomiła przezroczystą aktywność okna uprawnień.

Optymalizacja

Działania przezroczyste dziedziczą ograniczenia z najwyższego nieprzezroczystego działania znajdującego się pod nimi na stosie działań zadania. Aktywność nieprzezroczysta musi być dostępna przez cały cykl życia aktywności przezroczystej, od jej utworzenia do zniszczenia. Z tego powodu nie uruchamiaj próśb o uprawnienia z aktywności trampolinowych.

Jeśli aktywność trampoliny uruchamia prośbę o uprawnienia, użytkownik może nie zobaczyć okna uprawnień, ponieważ aktywność trampoliny zostanie zniszczona, zanim użytkownik będzie miał możliwość zareagowania na okno, a wymiary i pozycja okna aktywności mogły zostać obliczone nieprawidłowo.

Aplikacje powinny zawsze uruchamiać prośby o uprawnienia z działań, które pozostają widoczne, dopóki użytkownik nie podejmie decyzji w sprawie udzielenia zgody.

Zaokrąglone rogi

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ępnego miejsca na ekranie. Jeśli aktywność przezroczysta wypełnia dostępny obszar wyświetlania, system automatycznie stosuje do niej zaokrąglone rogi, jeśli zostało to skonfigurowane przez producenta urządzenia. Jeśli jednak aktywność przezroczysta (np. okno uprawnień) nie wypełnia dostępnego miejsca, to od Ciebie zależy, czy zastosujesz zaokrąglone rogi.

Okna uprawnień nie wypełniają dostępnego miejsca na ekranie, ponieważ ich układ zwykle używa parametru LayoutParams.WRAP_CONTENT, a nie LayoutParams.MATCH_PARENT.

Obejście problemu ze zgodnością

Aktywności, które uruchamiają aktywności okna, powinny być widoczne, dopóki użytkownik nie odpowie na okno.

System dba o to, aby przezroczyste działanie dziedziczyło wszystkie ograniczenia z pierwszego nieprzezroczystego działania znajdującego się pod nim na stosie działań, 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 Unity traci ostrość i przestaje wyświetlać treści, gdy aplikacja jest w trybie wielu okien.

Problem

W Unity 2019.4 dodano opcję Resizable Window, aby umożliwić obsługę trybu wielu okien na Androidzie. Jednak początkowa implementacja nie reagowała prawidłowo na cykl życia działania w trybie wielu okien, co powodowało, że UnityPlayer zawieszał odtwarzanie, gdy aplikacja traciła zaznaczenie. Odtwarzacz wyświetlił czarny ekran lub ostatnią, zamrożoną klatkę gry. Rozgrywka została wznowiona dopiero po dotknięciu ekranu przez użytkownika. Wiele aplikacji korzystających z silnika Unity ma ten problem i w trybie wielu okien wyświetla się jako czarne okno.

Optymalizacja

Zaktualizuj Unity do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. Pozostaw zaznaczoną opcję Resizable Window w ustawieniach odtwarzacza Androida. W przeciwnym razie gra zostanie wstrzymana, gdy nie będzie aktywna, mimo że będzie w pełni 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 zapewnić fałszywe zdarzenie zaznaczenia 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.

Rozmiar aplikacji 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 taka, której rozmiaru nie można zmienić (resizeableActivity = false), interfejs aktywności jest skalowany z zachowaniem tego samego formatu obrazu.

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

Podgląd z aparatu w trybie okien na pulpicie

Gdy aplikacja działa w trybie okien na pulpicie, obrót wyświetlacza i orientacja okna mogą się różnić od tych, które występują w trybie pełnoekranowym na standardowych telefonach.

Problem

Aplikacje często zakładają, że orientacja urządzenia i czujnika aparatu jest pionowa, co może skutkować nieprawidłowym lub zniekształconym podglądem z aparatu.

Optymalizacja

Aplikacje do obsługi aparatu muszą prawidłowo identyfikować orientację urządzenia i czujnika aparatu oraz zarządzać nią, aby wyświetlać prawidłowo wyrównany i skalowany podgląd z aparatu. Aplikacje muszą obliczać obrót urządzenia, obrót czujnika i format obrazu okna, a następnie stosować wyniki do podglądu z aparatu, który powinien też reagować na zmiany konfiguracji okna. Szczegółowe instrukcje znajdziesz w artykule Podgląd z kamery.

Obejście problemu ze zgodnością

Gdy aplikacje o stałej orientacji w trybie okien na pulpicie uruchamiają podgląd z aparatu, system może zastosować tryb zgodności aparatu, aby uniknąć rozciągniętych i obróconych podglądów.

W tym przypadku środowisko jest umieszczane w piaskownicy, aby dopasować je do żądanej orientacji w następujący sposób:

  • Wyświetlanie okna aplikacji w żądanym układzie z czarnymi pasami: pozwala to uniknąć problemów z rozciąganiem obrazu z powodu nieprawidłowego skalowania.

  • Izolowanie obrotu wyświetlacza: symuluje umieszczenie urządzenia w żądanej orientacji. Najczęstszym błędnym założeniem dotyczącym podglądu z aparatu jest to, że aplikacja działa na urządzeniu w orientacji pionowej. Dlatego obrót wyświetlacza jest ograniczony do 0 stopni w przypadku aplikacji, które wymagają orientacji pionowej, i do 90 stopni w przypadku urządzeń, które wymagają orientacji poziomej.

  • Przycinanie obrazu z kamery: jeśli obrót wyświetlacza uległ zmianie, jest to odzwierciedlone w przekazie z kamery. Jeśli urządzenie jest w orientacji poziomej, a aplikacja żąda orientacji pionowej, pole widzenia kamery jest przycinane, aby przypominało pole widzenia kamery w orientacji pionowej.

  • Obracanie i przycinanie przekazu z kamery: po zastosowaniu ustawienia system przełącza się między metodami aktywności onStop() i onStart() (domyślnie) lub onPause() i onResume() (stosowanymi przez zastąpienie OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE dla aplikacji), aby upewnić się, że podgląd z kamery jest prawidłowo wyświetlany.

Deweloperzy aplikacji mogą zastąpić te obejścia, jeśli aplikacje prawidłowo obsługują podgląd z aparatu. Zobacz Zastąpienia ustawień poszczególnych aplikacji.

Zmieniam rozmiar

Gdy symulowana orientacja jest aktywna, zmiana rozmiaru okna powoduje skalowanie interfejsu wizjera przy zachowaniu jego formatu obrazu. Rozmiar pozostałej części okna aplikacji można dowolnie zmieniać.

Testowanie aplikacji pod kątem problemów ze zgodnością

Aby przetestować aplikację i zobaczyć, jak zachowuje się na różnych formatach, skorzystaj z tych materiałów:

Ma czarne pasy u góry i u dołu ekranu

Sprawdź, czy każda aktywność może wykorzystywać całą przestrzeń wyświetlania dostępną dla aplikacji. Najpierw zadeklaruj ten kod w folderze testowym:

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 sprawdzić 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 przeprowadzać ten test tylko do momentu, gdy zakończy się powodzeniem i potwierdzi, że aktywności aplikacji zajmują całą dostępną dla niej przestrzeń wyświetlania. Przetestuj aplikację na wszystkich typach urządzeń, aby upewnić się, że działa spójnie.

Zastąpienia według aplikacji

Android udostępnia zastąpienia, które zmieniają skonfigurowane działanie aplikacji. Na przykład zastąpienie FORCE_RESIZE_APP instruuje system, aby pominął tryb zgodności rozmiaru i zmienił rozmiar aplikacji, aby pasowała 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 określonych urządzeniach. Na Androidzie 14 (API na poziomie 34) i nowszych użytkownicy mogą stosować zastąpienia w aplikacjach w ustawieniach urządzenia. Na Androidzie 16 (poziom interfejsu API 36) i nowszych właściciele urządzeń wirtualnych stosują zastąpienia na wybranych urządzeniach, którymi zarządzają.

Zastąpienia użytkownika według aplikacji

Na Androidzie 14 i nowszych menu ustawień umożliwia użytkownikom zmianę formatu obrazu aplikacji. Urządzenia z dużym ekranem, takie jak urządzenia referencyjne, implementują menu.

Menu zawiera listę wszystkich aplikacji zainstalowanych na urządzeniu. Użytkownicy wybierają aplikację, a następnie ustawiają format obrazu na 3:4, 1:1, pełny ekran lub inną wartość skonfigurowaną przez producenta urządzenia. Użytkownicy mogą też przywrócić domyślny format obrazu aplikacji, który jest określony w jej manifeście 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 formatu obrazu przez użytkownika, dodaj właściwość do pliku manifestu aplikacji i ustaw wartość na false:

    <application>
        <property
            android:name="android.window.
            PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE"
            android:value="false" />
    </application>
    

    Twoja 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 efektu.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    Aby zrezygnować z opcji pełnego ekranu w ramach zastąpienia zgodności formatu obrazu użytkownika, dodaj tę właściwość do pliku manifestu aplikacji i ustaw jej wartość na false:

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE"
            android:value="false" />
    </application>
    

    Opcja pełnego ekranu została usunięta z listy opcji formatu obrazu w ustawieniach urządzenia. Użytkownicy nie będą mogli zastosować zastąpienia pełnego ekranu w 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 formatu obrazu. 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 na urządzeniu według aplikacji

Producenci urządzeń i właściciele urządzeń wirtualnych (wybierz zaufane i uprzywilejowane aplikacje) stosują zastąpienia dla poszczególnych aplikacji na określonych 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 do różnych aplikacji.

Aplikacje mogą zrezygnować z większości zastąpień (patrz tabela Zastąpienia dla poszczególnych aplikacji poniżej).

Możesz przetestować aplikację z włączonymi lub wyłączonymi zastąpieniami, korzystając z systemu sprawdzania zgodności (zobacz Narzędzia systemu sprawdzania zgodności). Gdy ta opcja jest włączona, zastąpienia dotyczą 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 dostępne zastąpienia oraz wskazówki, jak zoptymalizować aplikację, aby nie musiała na nich polegać. Aby zrezygnować z niektórych zastąpień, możesz dodać do pliku manifestu aplikacji flagi właściwości.

Zastąpienia według aplikacji
Typ Nazwa Identyfikator Opis
Zgodność danych wejściowych OVERRIDE_MOUSE_TO_TOUCH 413207127 Konwertuje instancje MotionEvent z myszy na zdarzenia dotknięcia, zmieniając źródło i typ narzędzia MotionEvent, gdy są one dostarczane do aplikacji.
Możliwość zmiany rozmiaru FORCE_RESIZE_APP 174042936 Pomija tryb zgodności rozmiaru aplikacji w przypadku zmian konfiguracji.
FORCE_NON_RESIZE_APP 181136395 Wymusza tryb zgodności z rozmiarem aplikacji po zmianie konfiguracji.
Format obrazu OVERRIDE_MIN_ASPECT_RATIO 174042980 Zastąpienie Gatekeeper, które musi być włączone, 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), zastąpienie jest ograniczone do aktywności tylko w orientacji pionowej.
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 obrazu na podzielonym ekranie).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Wyłącza zastępowanie minimalnego formatu obrazu, 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 o 180 stopni aplikacje, które działają tylko w orientacji poziomej.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Ogranicza zakres zastępowania orientacji do sytuacji, gdy aplikacja jest połączona z aparatem.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Ustawia wyświetlacz w stałej orientacji poziomej, gdy zadanie jest wyświetlane na pełnym ekranie (w tym w formacie letterbox).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Ignoruje żądania orientacji z aplikacji, aby uniknąć nieskończonych pętli obracania.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Ignoruje powtarzające się żądania orientacji podczas ponownego uruchamiania aktywności. Jeśli Android wykryje, że aplikacja żąda co najmniej 2 nowych orientacji w ciągu 1 sekundy, system uzna to za nieskończoną pętlę obrotu i zastosuje zastąpienie.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Zapobiega wyświetlaniu czarnych pasów, wyłączając ustawienie ignorowania żądania orientacji przez producenta urządzenia.
Interfejsy API piaskownicy NEVER_SANDBOX_DISPLAY_APIS 184838306 Uniemożliwia zmianę działania interfejsów API wyświetlacza.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Wymusza na interfejsach API Display w aplikacji zwracanie granic aplikacji. Interfejsy API Display zwracają granice logicznego 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 na interfejsach API View używanych w aplikacji zwracanie granic aplikacji. Interfejsy API View zwracają granice logicznego obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API View zwracają granice aplikacji, co prowadzi do problemów z interfejsem.
Zgodność aparatu OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Wyłącza wymuszoną rotację. Domyślnie wszystkie aplikacje aparatu o stałej orientacji są wymuszane, gdy podgląd aparatu jest otwarty.
OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION 398195815 Wyłącza symulowanie żądanego traktowania orientacji na potrzeby zgodności z aparatem. Domyślnie aplikacje aparatu o stałej orientacji są dostosowywane na podstawie żądanej orientacji, gdy podgląd z aparatu jest otwarty.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Usuwa domyślne wymuszone odświeżenie stosowane, gdy podgląd z kamery jest wymuszony.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Przełącza twarde odświeżanie na miękkie, gdy podgląd z kamery jest wymuszany, co pomaga zachować stan podczas wymuszonego obrotu. Domyślnie Android stosuje twarde odświeżanie, gdy podgląd z aparatu jest wymuszany. Wymuszone odświeżenie może powodować problemy z utratą stanu aplikacji lub ich wygaszaniem, w zależności od tego, jak aplikacje zapisały w pamięci podręcznej swój poprzedni stan.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Przycina bufor obrazu wewnętrznego aparatu przedniego. Jeśli zastąpienie jest wyłączone, przycinanie obrazu z wewnętrznego aparatu przedniego jest usuwane, a pole widzenia podglądu z aparatu jest zwiększane. Domyślnie na niektórych urządzeniach składanych (zobacz urządzenia referencyjne) system przycina podgląd aparatu we wszystkich aplikacjach aparatu, gdy używany jest wewnętrzny aparat przedni.
Pozostałe postanowienia OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Zapobiega zaciemnianiu aplikacji, gdy straci ona fokus w trybie podzielonego ekranu. Aplikacja czeka na zaznaczenie, zanim wyświetli treści, co może spowodować jej zawieszenie lub wyświetlenie czarnego ekranu. Zastąpienie umożliwia Androidowi wysłanie do aplikacji fałszywego zdarzenia zaznaczenia, które sygnalizuje aplikacji, że ma ponownie zacząć rysować treści.
OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS 388014743 Wyklucza wstawki paska napisów z granic aplikacji w konfiguracji aktywności w trybie okien na pulpicie, zapobiegając zasłanianiu górnych lub dolnych elementów interfejsu aplikacji przez pasek napisów lub ich przycinaniu, gdy aplikacja nie obsługuje wstawek paska napisów.

OVERRIDE_MOUSE_TO_TOUCH

Włącza tryb zgodności, który konwertuje instancje MotionEvent z myszy lub touchpada na zdarzenia dotknięcia, zmieniając źródło MotionEvent na SOURCE_TOUCHSCREEN i typ narzędzia MotionEvent na TOOL_TYPE_FINGER, gdy zdarzenia ruchu są dostarczane do aplikacji.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Nie dotyczy. Problem należy rozwiązać w logice aplikacji.

Optymalizacja aplikacji

Aplikacja powinna obsługiwać zdarzenia wejściowe z myszy i touchpada, w tym gesty na touchpadzie i przewijanie kółkiem myszy. Zobacz Klawiatura, mysz i trackpad.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zadeklaruj FEATURE_PC w elemencie <uses-feature> w pliku manifestu aplikacji.

<uses-feature android:name="android.hardware.type.pc"
              android:required="false" />

Uwaga: ustaw android:required="false", aby funkcja PC była opcjonalna, a Google Play nie wykluczało aplikacji na urządzeniach innych niż PC.

Flagi właściwości do dostosowania zastąpienia

Brak.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MOUSE_TO_TOUCH <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MOUSE_TO_TOUCH <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

FORCE_RESIZE_APP

Wymusza, aby pakiety, do których stosowane jest zastąpienie, miały możliwość zmiany rozmiaru i przejścia w tryb wielu okien. Dotyczy wszystkich rozmiarów wyświetlaczy.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

W pliku manifestu aplikacji ustaw atrybut android:resizeableActivity na true.

Optymalizacja aplikacji

Używaj elastycznych/adaptacyjnych układów, aby aplikacje mogły dostosowywać się do wszystkich rozmiarów i formatów obrazu. Zobacz Obsługa różnych rozmiarów wyświetlaczy.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES na false.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie i umożliwić zmianę rozmiaru aplikacji:

adb shell am compat enable FORCE_RESIZE_APP <package>

Aby usunąć zastąpienie:

adb shell am compat disable FORCE_RESIZE_APP <package>

Uwaga: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.

FORCE_NON_RESIZE_APP

Wymusza, aby pakiety, do których stosowane jest zastąpienie, nie miały możliwości zmiany rozmiaru i wchodziły w tryb zgodności rozmiaru po zmianie konfiguracji. Dotyczy wszystkich rozmiarów wyświetlacza.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

W manifeście aplikacji ustaw atrybut android:resizeableActivity i flagę metadanych android.supports_size_changes na false i zadeklaruj ograniczenie orientacji lub formatu obrazu.

Optymalizacja aplikacji

Wszystkie aplikacje, które działają prawidłowo po zmianie rozmiaru, powinny mieć ustawioną wartość true w atrybucie android:resizeableActivity lub android.supports_size_changes. Inne aplikacje powinny zostać ulepszone, aby działały prawidłowo 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 właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie i uniemożliwić zmianę rozmiaru aplikacji:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

Aby usunąć zastąpienie:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO

Strażnik wszystkich zastąpień, które wymuszają dany minimalny format obrazu.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw android:minAspectRatio na poziomie aktywności lub aplikacji.

Optymalizacja aplikacji

Nie ustawiaj w aplikacji ograniczeń dotyczących formatu obrazu. Upewnij się, że aplikacja obsługuje różne rozmiary wyświetlacza. Używaj klas rozmiaru okna, aby obsługiwać różne układy w zależności od ilości miejsca, jaką aplikacja ma na ekranie. Zobacz Compose WindowSizeClass API i View WindowSizeClass API.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Określ ograniczenie formatu obrazu lub ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE na false.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
  android:value="false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Ogranicza ustawienia aplikacji, które wymuszają dany minimalny format obrazu w przypadku aktywności tylko w orientacji pionowej. Ta opcja jest domyślnie włączona i działa tylko wtedy, gdy włączona jest też opcja OVERRIDE_MIN_ASPECT_RATIO.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi właściwości do dostosowania zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_SMALL

Ustawia minimalny format obrazu aktywności na małą wartość (4:3).

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi właściwości do dostosowania zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_SMALL <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

Ustawia minimalny format obrazu aktywności na średnią wartość (3:2).

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi właściwości do dostosowania zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Ustawia minimalny format obrazu aktywności na dużą wartość (16:9).

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi właściwości do dostosowania zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Umożliwia korzystanie z formatu obrazu na podzielonym ekranie. Umożliwia aplikacji wykorzystanie całej dostępnej przestrzeni w trybie podzielonego ekranu, co pozwala uniknąć efektu letterbox.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi właściwości do dostosowania zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

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 efekt 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 właściwości do dostosowania zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_ANY_ORIENTATION

Umożliwia zastąpienie dowolnej orientacji za pomocą tych zastąpień:

Jak aplikacje mogą osiągnąć ten sam efekt 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: pozwalając systemowi na zniszczenie i ponowne utworzenie aplikacji lub samodzielnie zarządzając 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, ale może to nie być tak skalowalne jak umożliwienie użytkownikowi obracania aplikacji w razie potrzeby. Na Androidzie 12L i nowszych wersjach stałą orientację można zastąpić konfiguracją urządzenia. Więcej informacji o obsłudze zmian konfiguracji i obsłudze 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 właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_ANY_ORIENTATION_TO_USER

Umożliwia aplikacji wypełnienie dostępnego miejsca na ekranie. Zastępuje wszelkie ograniczenia dotyczące orientacji, możliwości zmiany rozmiaru i formatu obrazu określone w manifeście aplikacji. Ignoruje też wszystkie wywołania funkcji Activity#setRequestedOrientation() i Activity#getRequestedOrientation().

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

  • Nie ustawiaj atrybutu pliku manifestu android:screenOrientation lub ustaw go na "user".

  • Ustaw atrybut manifestu android:resizeableActivity na true.

  • Aby na małych ekranach umożliwić zmianę rozmiaru aplikacji, a jednocześnie wyłączyć tryb wielu okien za pomocą android:resizeableActivity=false, ustaw flagę metadanych android.supports_size_changes na true. Nie ustawiaj parametrów minAspectRatio i maxAspectRatio.

Optymalizacja aplikacji

Włącz obsługę wszystkich orientacji w aplikacji. Nie ustawiaj specyfikacji screenOrientation w pliku manifestu aplikacji. Zapewnij obsługę zmiany rozmiaru aplikacji, trybu wielu okien i wszystkich formatów obrazu, ustawiając atrybut android:resizeableActivity w pliku manifestu aplikacji na true. Zobacz Obsługa różnych rozmiarów wyświetlaczy.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zobacz: OVERRIDE_ANY_ORIENTATION.

Flagi właściwości do dostosowania zastąpienia

Zobacz: OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Uwaga: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Włącza orientację pionową we wszystkich aktywnościach w pakiecie. Jeśli nie jest włączona opcja 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 efekt 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 właściwości do dostosowania zastąpienia

Zobacz: OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Włącza orientację nosensor we wszystkich aktywnościach w pakiecie. Jeśli nie jest włączona opcja 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 efekt 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 właściwości do dostosowania zastąpienia

Zobacz: OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Włącza orientację reverseLandscape we wszystkich aktywnościach w pakiecie. Jeśli nie jest włączona opcja 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 efekt 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 właściwości do dostosowania zastąpienia

Zobacz: OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Ogranicza zastąpienia OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE, aby działały tylko wtedy, gdy połączenie z aparatem jest aktywne.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Zobacz: OVERRIDE_ANY_ORIENTATION.

Optymalizacja aplikacji

Zobacz: OVERRIDE_ANY_ORIENTATION.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Zobacz: OVERRIDE_ANY_ORIENTATION.

Flagi właściwości do dostosowania zastąpienia

Zobacz: OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

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 rezygnacji PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE nie jest włączona
  • Włączone jest ustawienie ignorowania żądania orientacji przez producenta urządzenia.
  • Naturalna orientacja wyświetlacza to pozioma

Jak aplikacje mogą osiągnąć ten sam efekt 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 właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Włącza zasadę zgodności, która pomija aktualizowanie orientacji aplikacji w odpowiedzi na wywołanie przez aplikację metody Activity#setRequestedOrientation(), gdy aplikacja jest uruchamiana ponownie lub ma aktywną funkcję zgodności z aparatem.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION na true.

Optymalizacja aplikacji

Zobacz: OVERRIDE_ANY_ORIENTATION.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION na false.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

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 aplikację metody Activity#setRequestedOrientation() więcej niż 2 razy w ciągu sekundy, jeśli aktywność nie jest wyświetlana w formacie letterbox w przypadku stałej orientacji.

Jak aplikacje mogą osiągnąć ten sam efekt 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 właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
  android:value="false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Wyklucza pakiety z ignorowania żądania orientacji, które może być włączone przez producentów urządzeń w przypadku obszaru wyświetlania lub całego wyświetlacza.

Jak aplikacje mogą osiągnąć ten sam efekt 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ć

Brak możliwości rezygnacji. Wyłączenie zastąpienia może być niebezpieczne, jeśli aplikacja nie jest zgodna z urządzeniem, na którym producent urządzenia włączył ustawienie ignorowania żądania orientacji. Aby wyłączyć zastąpienie, skontaktuj się z zespołem ds. relacji z deweloperami aplikacji na Androida.

Flagi właściwości do dostosowania zastąpienia

Brak flag właściwości dla tego zastąpienia.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

NEVER_SANDBOX_DISPLAY_APIS

Wymusza, aby pakiety nigdy nie miały stosowanego piaskownicy interfejsu API Display w przypadku aktywności w trybie letterbox lub trybie zgodności rozmiaru. Interfejsy API Display nadal podają granice obszaru wyświetlania.

Jak aplikacje mogą osiągnąć ten sam efekt 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 obszaru ekranu, który aplikacja ma na bieżącym wyświetlaczu. Zobacz Korzystanie z klas rozmiarów okien.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Brak możliwości rezygnacji. Przejdź z wycofanych interfejsów API.

Flagi właściwości do dostosowania zastąpienia

Brak flag właściwości dla tego zastąpienia.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

Aby usunąć zastąpienie:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

ALWAYS_SANDBOX_DISPLAY_APIS

Wymusza, aby pakiety zawsze miały zastosowane piaskownice interfejsu API Display niezależnie od trybu okien. Interfejsy API Display zawsze podają granice aplikacji.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Zadeklaruj, że aktywności nie można zmieniać, ustawiając atrybut android:resizeableActivity na false lub flagę metadanych android.supports_size_changes na false.

Optymalizacja aplikacji

Aplikacje, które deklarują, że można w pełni zmieniać ich rozmiar, nie powinny nigdy 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ć

Brak możliwości rezygnacji. Przejdź z wycofanych interfejsów API.

Flagi właściwości do dostosowania zastąpienia

Brak flag właściwości dla tego zastąpienia.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Aby usunąć zastąpienie:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Wymusza na pakietach umieszczanie w piaskownicy tych interfejsów API View w granicach aktywności:

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Rozwiąż problem w kodzie aplikacji, używając interfejsów API, które podają granice okna aplikacji i 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 używać interfejsów API View, biorąc pod uwagę możliwość zastosowania w aplikacji letterboxingu i trybu wielu okien. Zobacz 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 właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
  android:value="false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Wyłącza wymuszoną rotację. Poprawia wygodę korzystania z niektórych aplikacji.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION na false.

Optymalizacja aplikacji

Nie polegaj na zapisanej w pamięci podręcznej orientacji czujnika aparatu ani na informacjach o urządzeniu. Wskazówki dotyczące zgodności aparatu znajdziesz w artykułach Introducing Camera Viewfinder (Przedstawiamy wizjer aparatu) i Support resizable surfaces in your camera app (Obsługa powierzchni o zmiennym rozmiarze 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 właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, które usuwa wymuszone obracanie:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Aby usunąć zastąpienie, które umożliwia wymuszenie rotacji:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION

Wyłącza symulowanie żądanej orientacji aparatu. Poprawia wygodę korzystania z niektórych aplikacji.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION 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 aparatu znajdziesz w artykułach Introducing Camera Viewfinder (Przedstawiamy wizjer aparatu) i Support resizable surfaces in your camera app (Obsługa powierzchni o zmiennym rozmiarze w aplikacji aparatu).

Jak wyłączyć zastępowanie lub z niego zrezygnować

Ta właściwość wyłącza tryb zgodności, więc możesz poprawić wrażenia użytkownika, uwzględniając dynamiczne zmiany obrotu wyświetlacza, orientację czujnika urządzenia oraz rozmiar okna i podglądu.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_SIMULATE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, które usuwa symulowanie żądanej orientacji:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

Aby usunąć zastąpienie, które umożliwia symulowanie żądanej orientacji:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_SIMULATE_REQUESTED_ORIENTATION <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Wyłącza odświeżanie aktywności po wymuszonym obróceniu. Zwiększa wygodę użytkowników, gdy odświeżenie powoduje utratę stanu w aplikacjach.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH na false.

Optymalizacja aplikacji

Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH na true.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, które usuwa odświeżanie aktywności:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Aby usunąć zastąpienie, które umożliwia odświeżanie aktywności:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

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 wymuszonym obrocie w celu zapewnienia zgodności z aparatem.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE na true.

Optymalizacja aplikacji

Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE na false.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Wymusza przycięcie obrazu z kamery do przeciwnej orientacji, gdy orientacja pionowa kamery nie jest zgodna z naturalną orientacją urządzenia. Wiele aplikacji nie radzi sobie z taką sytuacją i wyświetla rozciągnięte obrazy.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT na true.

Optymalizacja aplikacji

Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT na false.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, które powoduje przycięcie obrazu z wewnętrznego aparatu przedniego:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Aby usunąć zastąpienie, co spowoduje usunięcie przycinania obrazu z wewnętrznego aparatu przedniego:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Uniemożliwia aplikacjom rezygnację z udostępniania ekranu aplikacji (patrz Media projection). Zaimplementowano, gdy aplikacje nadużywają interfejsu API createConfigForDefaultDisplay(), aby wymusić przechwytywanie pełnego ekranu i naruszyć prywatność użytkownika przez ujawnienie 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 efekt co zastąpienie

Zezwalaj na domyślne zachowanie projekcji multimediów (wdrożone w Androidzie 14, poziom interfejsu API 34, z createScreenCaptureIntent()), które umożliwia użytkownikom decydowanie, czy chcą udostępniać cały ekran czy pojedyncze okno aplikacji, niezależnie od trybu okna. Możesz też wywołać funkcję createScreenCaptureIntent(MediaProjectionConfig) z argumentem MediaProjectionConfig zwróconym przez wywołanie funkcji createConfigForUserChoice().

Optymalizacja aplikacji

Zezwalaj użytkownikom na wybór, czy podczas projekcji multimediów chcą udostępniać cały ekran urządzenia czy okno aplikacji. Od Androida 14 jest to działanie domyślne.

Zezwól na 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 wagę prywatności użytkowników aplikacja nie może wyłączyć tego zastąpienia ani z niego zrezygnować.

Flagi właściwości do dostosowania zastąpienia

Brak.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, które anuluje rezygnację aplikacji z częściowego udostępniania ekranu (czyli włącza częściowe udostępnianie 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 częściowego udostępniania ekranu:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

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 zaczną rysować zawartość aplikacji. Dlatego fałszywy fokus pomaga aplikacjom uniknąć czarnego ekranu, gdy zostaną wznowione i nie mają jeszcze fokusu.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS na true.

Optymalizacja aplikacji

Możesz uniknąć tego problemu, jeśli Twoja aplikacja dobrze obsługuje wiele orientacji i zmiany konfiguracji. Włącz obsługę wszystkich formatów urządzeń i trybów okien aplikacji, postępując zgodnie ze wskazówkami dotyczącymi jakości aplikacji adaptacyjnych.

Jeśli używasz silnika gry Unity, uaktualnij go do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. W ustawieniach odtwarzacza Androida pozostaw zaznaczoną opcję 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 właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Uwaga: polecenia te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

OVERRIDE_EXCLUDE_CAPTION_INSETS_FROM_APP_BOUNDS

Wyklucza wstawki paska podpisu z granic aplikacji w konfiguracji aktywności w trybie okien na pulpicie, zapobiegając zasłanianiu górnych lub dolnych elementów interfejsu aplikacji przez pasek podpisu lub ich przycinaniu, gdy aplikacja nie obsługuje wstawek paska podpisu.

Zwykle wstawki paska napisów nie są wykluczane z granic aplikacji w konfiguracji, a Configuration.screenHeightDp i granice aplikacji podają pełną wysokość okna, w tym obszar za paskiem napisów trybu okien na pulpicie (pasek tytułu z elementami sterującymi minimalizowania, maksymalizowania i zamykania, który pozostaje widoczny nawet w trybie pełnoekranowym):

  • Aplikacje pełnoekranowe lub immersyjne, które nie obsługują wstawek paska podpisu: obszar układu aplikacji obejmuje całe okno, więc jeśli aplikacja nie wysyła zapytania do WindowInsets, aby przesunąć interfejs, górne elementy sterujące mogą być wyświetlane bezpośrednio pod paskiem podpisu.
  • Aplikacje, w których wstawki paska podpisu są wymuszane przez system: aby zapobiec rysowaniu przez aplikację za paskiem podpisu, system przesuwa widok główny aplikacji poniżej paska podpisu. Jeśli aplikacja określa rozmiar układu na podstawie nieskorygowanych granic Configuration.screenHeightDp lub granic aplikacji, a nie wymiarów widocznego obszaru, renderuje układ o wysokości całego okna, zaczynając od paska podpisu, co powoduje przesunięcie dolnych elementów interfejsu poza dolną krawędź okna i nieprawidłowe wyrównanie docelowych elementów dotykowych.

Gdy zastąpienie jest włączone, system odejmuje wysokość paska podpisu od granic aplikacji i Configuration.screenHeightDp, dzięki czemu obszar układu aplikacji jest wyrównany z przestrzenią pod paskiem podpisu.

Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie

Włącz wyświetlanie bez ramki. Zobacz:

Optymalizacja aplikacji

Możesz uniknąć tego problemu, jeśli Twoja aplikacja umożliwia wyświetlanie bez ramki.

Jak wyłączyć zastępowanie lub z niego zrezygnować

Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS na false.

Flagi właściwości do dostosowania zastąpienia

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_EXCLUDE_CAPTION_INSETS"
  android:value="true|false"/>

Polecenia adb do testowania zastąpienia

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 te powodują tylko tymczasowe zastosowanie lub usunięcie zastąpienia.

Dodatkowe materiały


  1. Właścicielem urządzenia wirtualnego jest zaufana aplikacja lub aplikacja z 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 rzeczywistości wirtualnej czy systemy multimedialne w samochodach. Właściciel urządzenia wirtualnego korzysta z urządzenia lokalnego, np. telefonu. ↩