Tryb zgodności urządzenia

Android aktywuje tryb zgodności w przypadku aplikacji, które deklarują ograniczenia dotyczące orientacji lub zmiany rozmiaru. Tryb zgodności zapewnia dopuszczalne działanie aplikacji na urządzeniach z dużym ekranem i składanych telefonach z klapką, ale nie jest w pełni optymalna.

Zastąpienia według aplikacji umożliwiają producentom urządzeń zmianę zachowania aplikacji, aby zwiększyć wygodę użytkowników lub zapobiec awariom aplikacji na określonych urządzeniach.

Urządzenia referencyjne

Ze względu na nietypowe konfiguracje lub konfiguracje, które nie są dobrze obsługiwane przez aplikacje, te urządzenia mogą wymagać zastąpień w zależności od aplikacji:

  • Tablety: niektóre tablety, takie jak Pixel Tablet, mają naturalną orientację poziomą. Gdy Display#getRotation() zwraca Surface.ROTATION_0, urządzenie ma swoją naturalną orientację. 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.
  • Urządzenia składane poziome: niektóre urządzenia składane, takie jak Pixel Fold, mają po złożeniu pionową orientację, a po rozłożeniu – orientację poziomą. Jeśli aplikacje zakładają, że orientacja rozłożona jest pionowa, prawdopodobnie występują problemy z pętlami migotania lub układem.
  • Składane telefony z klapką: rozłożone telefony z klapką mają zwykle orientację pionową. Jednak po złożeniu telefony zwykle mają mały wyświetlacz w orientacji poziomej. Aplikacje muszą określać i uwzględniać różne orientacje wyświetlaczy.

Typowe problemy ze zgodnością

Problemy ze zgodnością występują najczęściej z powodu ograniczeń orientacji aplikacji, zmiany rozmiaru i współczynnika proporcji obrazu, nieprawidłowej obsługi orientacji podglądu z aparatu oraz niewłaściwie używanych interfejsów API.

Letterboxing

Format Letterbox umieszcza aplikację na środku ekranu, a na dużych ekranach po jednej lub drugiej stronie, aby ułatwić Ci dostęp do niej. Maty (paski w jednolitym kolorze lub rozmyte tapety) wypełniają nieużywany obszar wyświetlacza wzdłuż boków oraz górnej i dolnej części aplikacji.

Format Letterbox często pojawia się na urządzeniach z dużym ekranem, ponieważ wymiary i współczynnik proporcji wyświetlacza urządzenia zazwyczaj różnią się od tych na standardowych telefonach, na które przeznaczona jest większość aplikacji.

Rysunek 1. Aplikacja dostępna tylko w orientacji pionowej na tablecie w orientacji poziomej i wersji składanej wyświetla się z czarnymi pasami.

Problem

Aplikacja nie obsługuje wszystkich konfiguracji wyświetlania, ponieważ ma stałą orientację i współczynnik proporcji albo nie można jej zmienić.

Ustawienia konfiguracji, które kontrolują orientację i zmianę rozmiaru aplikacji, obejmują te elementy:

  • screenOrientation: określa stałą orientację aplikacji. Aplikacje mogą też ustawiać orientację w czasie działania za pomocą funkcji Activity#setRequestedOrientation().

  • resizeableActivity: wskazuje, czy system może zmieniać rozmiar aplikacji, aby dopasować je do okien o różnych wymiarach. W Androidzie 11 (poziom interfejsu API 30) i starszych określa, czy aplikacje obsługują tryb wielu okien. Na Androidzie 12 (poziom interfejsu API 31) i nowszych określa, czy aplikacje obsługują tryb wielu okien na małych ekranach (sw < 600 dp). Na Androidzie 12 i nowszych aplikacje obsługują tryb wielu okien na dużych ekranach (sw >= 600 dp) niezależnie od tego ustawienia.

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

  • minAspectRatio: określa minimalny współczynnik proporcji obsługiwany przez aplikację. minAspectRatio można ustawiać tylko w aplikacjach, w których parametr resizeableActivity ma wartość false.

Optymalizacja

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

Obejście zgodności

Jeśli aplikacja o stałej orientacji lub stałym współczynniku proporcji nie działa w oknie, które nie obsługuje bezpośrednio rozmiaru lub orientacji okna, w Androidzie pojawią się w niej pionowe pasy, aby zachować ciągłość.

Począwszy od Androida 12 (poziom interfejsu API 31) po wersję 12L (poziom interfejsu API 32) platforma stosuje różne ulepszenia w aplikacjach z czarnymi pasami. Producenci urządzeń wdrażają ulepszenia interfejsu. Nie musisz tworzyć aplikacji, aby korzystać z udoskonaleń.

Android 12 (poziom interfejsu API 31) wprowadza te ulepszenia estetyczne, które producenci urządzeń mogą konfigurować:

  • Zaokrąglone rogi: rogi okna aplikacji mają bardziej wyrafinowany wygląd.
  • Przezroczystość paska systemowego: paski stanu i nawigacji, które nakładają się na aplikację, są półprzezroczyste, dzięki czemu ikony na słupkach są zawsze widoczne na tle litery.
  • Konfigurowany współczynnik proporcji: współczynnik proporcji aplikacji można dostosować, aby poprawić jej wygląd.

Rysunek 2. Aplikacja w Letterboxach z ulepszeniami interfejsu.

12L (poziom interfejsu API 32) dodaje te ulepszenia funkcjonalności:

  • Konfigurowalne pozycjonowanie: producenci urządzeń na dużych ekranach mogą umieścić aplikację po lewej lub prawej stronie wyświetlacza, co ułatwia interakcję.

  • Nowy wygląd przycisku ponownego uruchamiania: producenci urządzeń mogą zmienić wygląd przycisku ponownego uruchamiania w trybie zgodności z rozmiarem, aby użytkownicy mogli go lepiej rozpoznawać.

Android 13 (poziom interfejsu API 33) dodaje okno z informacjami dla użytkowników o umieszczaniu aplikacji z czarnymi pasami na ekranie oraz w trybie podzielonego ekranu:

Rysunek 3. Aplikacja w literowych pasach z oknem z informacjami dla użytkownika.

Tryb zgodności rozmiaru

Tryb zgodności rozmiaru to czarne pasy z elementem sterującym restartowaniem. Opcja ta umożliwia użytkownikom ponowne uruchomienie aplikacji i ponowne wyświetlenie obrazu. Android wywołuje tryb zgodności rozmiaru w przypadku aplikacji, które nie mogą zmieniać rozmiaru. Gdy działanie zostanie przeniesione do kontenera displayowego, który jest niezgodny z wymiarami działania, system może przeskalować aplikację tak, aby wypełniała wyświetlacz urządzenia co najmniej w jednym wymiarze.

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

  • Obracanie urządzenia
  • Składanie lub rozkładanie urządzenia
  • Przełączanie się między trybem pełnego ekranu i podzielonego ekranu

Problem

Tryb zgodności rozmiaru ma zwykle zastosowanie do działań o ograniczonej orientacji lub współczynniku proporcji, które zostały skonfigurowane (lub określone przez system) tak, aby nie można było zmieniać ich rozmiaru.

Uznaje się, że aplikacja można zmienić rozmiar (i nie zostanie zastosowana w trybie zgodności z rozmiarem), jeśli spełnia którekolwiek z tych kryteriów:

Jeśli aplikacja nie spełnia żadnego z tych warunków, uznamy, że nie można jej zmienić i może zostać zastosowana w trybie zgodności z rozmiarem.

Optymalizacja

Aplikacja powinna obsługiwać wszystkie rozmiary reklam displayowych. Aby umożliwić zmianę rozmiaru aplikacji, w pliku manifestu aplikacji ustaw atrybut android:resizeableActivity elementu <activity> lub <application> na true. Projektowanie elastycznych/adaptacyjnych układów dla aplikacji. Więcej informacji znajdziesz w artykułach o obsłudze różnych rozmiarów ekranu i obsłudze wielu okien.

Obejście zgodności

Android włącza tryb zgodności rozmiaru, gdy system stwierdzi, że wyświetlanie aplikacji z czarnymi pasami można poprawić, przeskalując aplikację tak, aby wypełniła okno wyświetlania w co najmniej 1 wymiarze. System wyświetla element sterujący ponownego uruchamiania, który odtwarza proces aplikacji, odtwarzając aktywność i wyświetlając ponownie wyświetlacz. Zobacz też Omówienie procesów i wątków.

Migoczące pętle

Jeśli aplikacja nie obsługuje wszystkich orientacji wyświetlacza, po zmianie konfiguracji może wielokrotnie żądać nowej orientacji, tworząc nieskończoną pętlę, w której wyświetlacz migocze lub aplikacja obraca się w nieskończoność.

Problem

W Androidzie 12 (poziom interfejsu API 31) i nowszych producenci urządzeń mogą skonfigurować swoje urządzenia tak, aby ignorowały ograniczenia orientacji określone przez aplikacje i zamiast tego używać tych ograniczeń do wymuszania trybów zgodności. Urządzenie składane może na przykład zignorować ustawienie android:screenOrientation="portrait" aktywności, gdy aktywność jest wyświetlana na wewnętrznym ekranie tabletu o orientacji poziomej.

Jeśli ograniczenia dotyczące orientacji aplikacji zostaną zignorowane, aplikacja może automatycznie ustawić swoją orientację, wywołując metodę Activity#setRequestedOrientation(). Wywołanie aktywuje ponowne uruchomienie aplikacji, jeśli aplikacja nie obsługuje zmian w konfiguracji (zobacz Obsługa zmian konfiguracji). Po ponownym uruchomieniu ograniczenia dotyczące orientacji aplikacji są ponownie ignorowane, aplikacja powtarza wywołanie funkcji setRequestedOrientation(), a następnie powoduje to ponowne uruchomienie aplikacji itd. w pętli samotrwałej.

Inny sposób może wystąpić, gdy naturalna orientacja (typowa orientacja ekranu urządzenia określona przez Androida) jest pozioma (tzn. wywołanie funkcji Display#getRotation() zwraca wartość Surface.ROTATION_0, gdy urządzenie ma współczynnik proporcji poziomego). Do tej pory aplikacje zakładały, że Display.getRotation() = Surface.ROTATION_0 oznacza, że urządzenie jest w orientacji pionowej, ale nie zawsze tak jest, np. na wewnętrznym ekranie niektórych składanych urządzeń i tabletów.

Aplikacja w orientacji poziomej na składanym wewnętrznym ekranie może sprawdzić obrót ekranu, otrzymać wartość ROTATION_0, przyjąć, że urządzenie ma naturalną orientację pionową, i wywołać setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ), aby zmienić układ aplikacji. Po ponownym uruchomieniu aplikacji (w orientacji poziomej) aplikacja może ponownie sprawdzić obrót ekranu, otrzymać wartość ROTATION_0, wywołać setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) i kontynuować pętlę nieskończoną.

Optymalizacja

Aplikacje nie mogą:

  • Ustaw domyślną orientację z użyciem Activity#setRequestedOrientation() w metodzie aktywności onCreate(), ponieważ żądanie orientacji może być nieoczekiwanie wywoływane przez nieobsłużone zmiany konfiguracji
  • Załóżmy, że naturalna orientacja urządzenia (ROTATION_0) jest pionowa
  • Ustaw orientację na podstawie sygnałów niezwiązanych z bieżącym rozmiarem okna, np. Display#getRotation(), obecności FoldingFeature lub wycofanych interfejsów API.

Obejście zgodności

Android ignoruje wywołania Activity#setRequestedOrientation() w tych sytuacjach:

  • Działanie zostało już wznowione z poprzedniego wywołania metody lub zostało włączone przetwarzanie siły zgodnej z aparatem (patrz Podgląd aparatu poniżej).

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

  • Aktywność wywołała więcej niż 2 żądania orientacji w ciągu jednej sekundy, co oznacza, że wystąpiła pętla. Z 2 żądań w pętli Android używa tego, który maksymalizuje obszar wyświetlania aplikacji.

    Producenci urządzeń mogą zastosować to zachowanie w aplikacji za pomocą funkcji OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED.

Podgląd z aparatu

Na tabletach, laptopach i składanych wyświetlaczach podgląd aparatu w aplikacjach aparatu (lub wizjer) może być niewłaściwie ułożony lub zniekształcony.

Problem

W dokumencie definicji zgodności z Androidem stwierdza się, że czujnik obrazu w aparacie „MUSI być zorientowany tak, by długi wymiar aparatu był zgodny z długością ekranu”.

Aplikacje często zakładają, że orientacja urządzenia i czujnik aparatu są pionowe, co w przypadku standardowych telefonów komórkowych jest uzasadnione. Tablety i laptopy mogą jednak korzystać z orientacji poziomej. Poza tym nowe urządzenia, takie jak urządzenia składane, mogą mieć wiele naturalnych orientacji i kilka czujników aparatu w różnych orientacjach.

Rozpoczęcie aktywności z orientacją aparatu, której aplikacja nie oczekuje, oraz przełączanie się między różnymi aparatami lub ekranami urządzenia (w przypadku urządzeń składanych) może spowodować niewłaściwie ustawiony lub zniekształcony podgląd z aparatu.

Optymalizacja

Aby wyświetlać poprawnie wyrównany i przeskalowany podgląd z aparatu, aplikacje aparatu muszą prawidłowo rozpoznawać orientację urządzenia i orientację czujnika aparatu oraz nimi zarządzać. Aplikacje muszą obliczyć obrót urządzenia, obrót czujnika oraz proporcje ekranu lub okna, a następnie zastosować wyniki do podglądu z aparatu. Szczegółowe wskazówki znajdziesz w artykułach Podgląd aparatu i Przedstawiamy wizjer aparatu.

Obejście zgodności

Urządzenie ma naturalną orientację, gdy Display#getRotation() zwraca Surface.ROTATION_0. System oblicza wartość CameraCharacteristics.SENSOR_ORIENTATION na podstawie naturalnej orientacji urządzenia. Android dopasowuje okno pionowe aplikacji z ograniczeniem pionowym do naturalnej orientacji urządzenia – tego oczekuje większość aplikacji. Android przycina też obraz z czujnika aparatu, gdy czujnik jest ustawiony poziomo, a podgląd aparatu jest w orientacji pionowej. Konkretne sposoby obejścia tego problemu to m.in.:

  • Wymuszaj obracanie podglądu aparatu w aplikacjach z ograniczeniem pionowym: aplikacje z ograniczoną orientacją pionową wymagają naturalnej orientacji urządzenia i czujnika aparatu w orientacji pionowej. Jednak w Androidzie 12 (poziom interfejsu API 31) i nowszych aplikacje mogą działać w różnych orientacjach urządzeń, jeśli producenci zignorują specyfikację orientacji.

    Gdy do aparatu podłączona jest aplikacja z ograniczeniem pionowym, Android wymusza jej obrót, aby dostosować okno aplikacji w orientacji pionowej do naturalnej orientacji urządzenia.

    Na niektórych tabletach (patrz urządzenia referencyjne) okno aplikacji w orientacji pionowej jest obrócone do pełnego ekranu, aby dostosować je do naturalnej orientacji urządzenia. Po użyciu siły obrót aplikacja zajmuje pełny ekran.

    Na poziomym ekranie wewnętrznym urządzeń składanych (patrz urządzenia referencyjne) czynności tylko w orientacji pionowej są obracane do orientacji poziomej, aby dopasować się do rozłożonej naturalnej orientacji. Po wymuszeniu rotacji aplikacja ma czarne pasy.

  • Przycinanie wewnętrznego przedniego aparatu: wewnętrzny czujnik przedniego aparatu w niektórych urządzeniach składanych ma orientację poziomą. Oprócz wymuszania obracania podglądu aparatu na składanym wewnętrznym ekranie Android przycina pole widzenia wewnętrznego przedniego (poziomego) aparatu, tak aby czujnik rejestruje obraz przeciwny od orientacji urządzenia.

  • Wymuś odświeżenie podglądów z kamery: system przełącza się między metodami aktywności onStop() i onStart() (domyślnie) lub onPause() i onResume() (zastosowanymi przez funkcję OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE) po wymuszeniu obrotu, aby mieć pewność, że podgląd z kamery wyświetla się prawidłowo.

  • Skalowanie formatu obrazu: system dynamicznie zmienia współczynnik proporcji podglądu z kamery przy wymuszonym obracaniu na wyższy minimalny współczynnik proporcji, co zapewnia prawidłowe skalowanie podglądu z kamery.

Deweloperzy aplikacji mogą zastąpić te obejścia, jeśli aplikacje poprawnie obsługują podgląd z aparatu. Zobacz Zastąpienia na poziomie aplikacji.

Interfejsy API często niewłaściwie używane

W związku z tym, że w Androidzie dodano obsługę funkcji takich jak tryb wielu okien i urządzenia takie jak urządzenia składane, starsze interfejsy API zostały wycofane i zastąpione aktualnymi interfejsami API, które działają na wszystkich ekranach o różnych rozmiarach i formatach. Jednak wycofane interfejsy API są nadal dostępne na potrzeby zgodności wstecznej.

Niektóre interfejsy API View są przeznaczone do specjalnych celów, które nie zawsze są dobrze zrozumiałe dla programistów.

Problem

Deweloperzy nadal używają wycofanych interfejsów API Display i nieprawidłowo zakładają, że zwracają granice aplikacji, a nie obszaru wyświetlania urządzenia. Deweloperzy mogą też omyłkowo używać interfejsów API widoków specjalnych do uzyskiwania ogólnych danych o wyświetlaniu. Efektem są błędne obliczenia podczas zmiany położenia elementów interfejsu po zdarzeniach zmiany rozmiaru okna aplikacji, co powoduje problemy z układem.

Wycofane i często używane interfejsy API w sieci reklamowej:

Więcej informacji znajdziesz w artykule o obsłudze trybu wielu okien.

Niewłaściwie użyte interfejsy API widoków:

Optymalizacja

Nigdy nie polegaj na rozmiarze fizycznego wyświetlacza przy określaniu pozycji elementów interfejsu. Przenieś swoją aplikację do interfejsów API, korzystając z WindowMetrics, w tym tych interfejsów API WindowManager:

Obejście zgodności

2 zastąpienia dostosowują wycofane interfejsy API Display i niewłaściwie użyte interfejsy API View do zwracania granic aplikacji: ALWAYS_SANDBOX_DISPLAY_APIS w przypadku interfejsów API Display lub OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS w przypadku interfejsów API View. Ustawienie ALWAYS_SANDBOX_DISPLAY_APIS jest też domyślnie stosowane do aplikacji, które kwalifikują się do trybu zgodności rozmiaru.

Działania przejrzyste

Aktywności przezroczyste są wynikiem stosowania 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 powiązane z oknami dialogowymi, takie jak Theme.MaterialComponents.Dialog, mogą zawierać style, które zapewniają przejrzystość działań.

Działania przezroczyste nie obejmują całej dostępnej przestrzeni wyświetlania, co utrudnia zarządzanie nimi, ponieważ dostępny obszar wyświetlania może się zmieniać zależnie od zmian w konfiguracji, takich jak obrót urządzenia, składanie i rozkładanie urządzenia czy tryb wielu okien.

Problem

Aktywność przezroczysta powinna spełniać wymagania granic pierwszej aktywności nieprzezroczystej poniżej aktywności przezroczystej w stosie działań. Nieprzezroczyste działanie, które uruchamia okno uprawnień, może być jednak trampoliną (aktywna, która powoduje uruchomienie kolejnej aktywności, a następnie znika). System nie może więc określić granic aktywności trampolinowej, która uruchomiła przejrzyste okno uprawnień.

Optymalizacja

Działania przezroczyste dziedziczą ograniczenia z najwyższej nieprzezroczystej aktywności poniżej w stosie aktywności zadania. Aktywność przezroczysta musi być dostępna przez cały cykl życia przezroczystego działania – od jej utworzenia do zniszczenia. Dlatego nie uruchamiaj próśb o uprawnienia pochodzących z trampolinów.

Jeśli aktywność na trampolinie uruchomi prośbę o przyznanie uprawnień, użytkownik może nie zobaczyć okna uprawnień, ponieważ została ona zniszczona, zanim zdążył zareagować na to okno, a wymiary i pozycja działania okna mogły zostać nieprawidłowo obliczone.

Aplikacje powinny zawsze wyświetlać prośby o przyznanie uprawnień pochodzące z działań, które są widoczne do czasu podjęcia decyzji o pozwoleniu przez użytkownika.

Zaokrąglone narożniki

Działanie może być przezroczyste ze względu na styl, który określa przezroczystość tła, lub dlatego, że zawartość działania nie wypełnia dostępnego miejsca do wyświetlania. Jeśli dostępna przestrzeń wyświetlania wypełnia przezroczysta aktywność, system automatycznie stosuje zaokrąglone rogi do aktywności, jeśli zostało tak skonfigurowane przez producenta urządzenia. Jeśli jednak działanie przezroczyste (np. okno zezwoleń) nie wypełni dostępnego miejsca, Ty decydujesz, czy zastosować zaokrąglone narożniki.

Okna uprawnień nie wypełniają dostępnej przestrzeni wyświetlania, ponieważ układ tych elementów zwykle korzysta z właściwości LayoutParams.WRAP_CONTENT, a nie LayoutParams.MATCH_PARENT.

Obejście zgodności

Zachowaj działania, które uruchamiają działania w oknie, dopóki użytkownik nie odpowie na to okno.

System dba o to, aby aktywność przezroczysta dziedziczyła wszystkie ograniczenia z pierwszej nieprzezroczystej aktywności w stosie aktywności przezroczystej, w tym:

  • Tryb zgodności rozmiaru
  • Orientacja
  • Format obrazu

Gry w jedność

Gry Unity działają na Androidzie na pełnym ekranie lub w trybie wielu okien. Wiele gier na Unity traci jednak ostrość i przestaje rysować po przejściu aplikacji w tryb wielu okien.

Problem

W Unity w wersji 2019.4 dodaliśmy opcję Resizable Window, aby obsługiwać tryb wielu okien na urządzeniach z Androidem. Jednak wstępna implementacja nie zareagowała prawidłowo na cykl życia aktywności w trybie wielu okien, przez co UnityPlayer zawieszał odtwarzanie, gdy aplikacja nie jest aktywna. Gracz wyrenderował czarny ekran lub ostatnią, nieruchomą klatkę w grze. Rozgrywka została wznowiona dopiero po dotknięciu ekranu. Wiele aplikacji korzystających z Unity Engine napotyka ten problem i wyświetla się jako czarne okno w trybie wielu okien.

Optymalizacja

Uaktualnij Unity do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. Zostaw zaznaczoną opcję Resizable Window w ustawieniach odtwarzacza Android. W przeciwnym razie gra zatrzymuje się, gdy nie jest aktywna, mimo że gra jest w pełni widoczna w trybie wielu okien.

Obejście zgodności

Producenci urządzeń mogą zastosować parametr OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS dla każdej aplikacji, aby utworzyć fałszywe zdarzenie zaznaczenia w aplikacji w trybie wielu okien. Zastąpienie pozwala aktywności na ponowne przekreślenie treści bez jej zamazania.

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

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

Ma czarne pasy

Sprawdź, czy każda aktywność może korzystać z całej przestrzeni wyświetlania dostępnej dla aplikacji. Najpierw zadeklaruj ten kod w folderze testowym:

Kotlin

fun Activity.isLetterboxed() : 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(Activity 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ć to zachowanie i upewnić się, że działanie docelowe nie ma czarnych pasów:

Kotlin

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test
fun activity_launched_notLetterBoxed() {
    activityRule.scenario.onActivity {
        assertThat(it.isLetterboxed()).isFalse()
    }
}

Java

@Rule
public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

public void activity_launched_notLetterBoxed() {
    try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) {
        scenario.onActivity(activity -> {
            assertThat(isLetterboxed(activity)).isFalse();
        });
    }
}

Przetestuj aplikację tylko do momentu, gdy zakończy się ona pomyślnie i nie potwierdzi, że działania w aplikacji zajmują całą dostępną dla niej przestrzeń wyświetlania. Przetestuj aplikację na wszystkich typach urządzeń, aby zapewnić spójne działanie.

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 dopasować ją do wymiarów wyświetlanych, nawet jeśli w manifeście aplikacji określono resizeableActivity="false".

Producenci urządzeń stosują zastąpienia w przypadku wybranych lub wszystkich aplikacji na określonych urządzeniach z dużym ekranem. Na Androidzie 14 (poziom interfejsu API 34) i nowszym użytkownicy mogą stosować zastąpienia w aplikacjach w ustawieniach urządzenia.

Zastąpienia użytkownika na aplikacje

Na Androidzie 14 i nowszych menu ustawień umożliwia użytkownikom zmianę współczynnika proporcji aplikacji. Menu są stosowane na dużych ekranach, np. na urządzeniach referencyjnych.

Menu zawiera listę wszystkich aplikacji zainstalowanych na urządzeniu. Użytkownik wybiera aplikację, a następnie ustawia współczynnik proporcji aplikacji na 3:4, 1:1, pełny ekran lub inną wartość konfigurowaną przez producenta urządzenia. Użytkownicy mogą też zresetować współczynnik proporcji aplikacji do domyślnego, określonego w manifeście aplikacji.

Aplikacje mogą zrezygnować z zastępowania zgodności, konfigurując te tagi PackageManager.Property:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    Aby zrezygnować z zastępowania zgodności formatu obrazu użytkownika, dodaj właściwość do pliku manifestu aplikacji i ustaw jej wartość na false:

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

    Aplikacja zostanie wykluczona z listy aplikacji w ustawieniach urządzenia. Użytkownicy nie będą mogli zastąpić współczynnika proporcji aplikacji.

    Ustawienie właściwości true nie ma żadnego efektu.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    Aby zrezygnować z opcji zastępowania zgodności współczynnika proporcji użytkownika na pełnym ekranie, dodaj tę właściwość do pliku manifestu aplikacji i ustaw jej wartość na false:

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

    Opcja pełnego ekranu zostanie usunięta z listy opcji formatu obrazu w ustawieniach urządzenia. Użytkownicy nie będą mogli zmienić trybu pełnoekranowego 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 ograniczeń formatów obrazu w aplikacji. Używaj klas rozmiaru okna, aby obsługiwać różne układy w zależności od ilości dostępnego miejsca.

Zastąpienia producenta urządzenia według aplikacji

Producenci urządzeń na wybranych urządzeniach stosują zastąpienia w poszczególnych aplikacjach. Urządzenia referencyjne mogą domyślnie stosować niektóre zastąpienia do różnych aplikacji.

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

Możesz przetestować aplikację z włączonymi lub wyłączonymi zastąpieniami, korzystając z platformy zgodności (zobacz narzędzia platformy zgodności). Gdy ta opcja jest włączona, zastąpienia mają zastosowanie do całej aplikacji.

Możesz też skorzystać z narzędzia Android Debug Bridge (adb), aby włączyć lub wyłączyć zastąpienia i określić, które zastąpienia mają zastosowanie w 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 na temat optymalizacji aplikacji tak, aby nie wymagała użycia zastąpień. Aby zrezygnować z niektórych zastąpień, możesz dodać flagi właściwości do pliku manifestu aplikacji.

Zastąpienia według aplikacji
Typ Nazwa ID Opis
Możliwość zmiany rozmiaru FORCE_RESIZE_APP 174042936 Pomija tryb zgodności rozmiaru w przypadku zmian w konfiguracji aplikacji.
FORCE_NON_RESIZE_APP 181136395 Wymusza tryb zgodności z rozmiarem w przypadku zmian konfiguracji.
Format obrazu OVERRIDE_MIN_ASPECT_RATIO 174042980 Zastąpienie bramy, które musi być włączone, aby zastosować inne zastąpienia współczynnika proporcji.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Jeśli ta opcja jest włączona (ustawienie domyślne), ogranicza zakres zastępowania do aktywności tylko w orientacji pionowej.
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 współczynnik proporcji, aby pasował do 50% rozmiaru wyświetlacza (lub współczynnika proporcji podzielonego ekranu).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Wyłącza zastępowanie minimalnego formatu obrazu, aby aplikacje wyświetlały się na pełnym ekranie, gdy urządzenie jest ustawione pionowo.
Orientacja OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Zastępuje orientację pionową, gdy aktywność ma niezdefiniowaną orientację.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Zastępuje orientację na nosensor (używa naturalnej orientacji urządzenia), gdy aktywność ma niezdefiniowaną orientację.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Obraca aplikacje w orientacji poziomej o 180 stopni.
OVERRIDE_ANY_ORIENTATION 265464455 Umożliwia zastąpienie dowolnej orientacji.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Ogranicza zakres zastępowania orientacji do sytuacji, gdy aplikacja jest podłączona do kamery.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Ustawia naturalną orientację poziomą na wyświetlaczu, gdy zadanie jest wykonywane na pełnym ekranie (także wtedy, gdy są wyświetlane na poziomych pasach).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Ignoruje żądania orientacji wysyłane z aplikacji, aby uniknąć zapętleń rotacji.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Ignoruje powtarzające się prośby o orientację podczas ponownego uruchamiania działania. Jeśli Android wykryje, że aplikacja prosi o co najmniej 2 nowe orientacje w ciągu 1 sekundy, system uznaje to za pętlę obrotu nieskończoną i stosuje zastąpienie.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Zapobiega czarnym pasom, wyłączając ustawienie żądania ignorowania orientacji przez producenta urządzenia.
Interfejsy API piaskownicy NEVER_SANDBOX_DISPLAY_APIS 184838306 Uniemożliwia zmianę działania wyświetlanych interfejsów API.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Wymusza interfejsy API Display w aplikacji, aby zwracały granice aplikacji. Interfejsy API Display zwracają logiczne granice obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API Display zwracają granice aplikacji, co prowadzi do problemów z interfejsem.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Wymusza zwracanie granic aplikacji przez interfejsy API View używane w aplikacji. Interfejsy API View zwracają logiczne granice obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API View zwracają granice aplikacji, co prowadzi do problemów z interfejsem.
Zgodność z aparatem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Wyłącza wymuszony obrót. Domyślnie obrót wszystkich aplikacji aparatu o stałej orientacji jest wymuszany po otwarciu podglądu z aparatu.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Usuwa domyślne ustawienie twardego odświeżania stosowane w przypadku wymuszania obracania podglądu aparatu.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Przełącza twarde odświeżanie na miękkie odświeżanie po wymuszonym obróceniu podglądu kamery, co pomaga zachować stan podczas obrotu siłowego. Domyślnie Android stosuje twarde odświeżanie, gdy podgląd z aparatu jest wymuszony na obróceniu. Twarde odświeżanie może powodować problemy z utratą stanu aplikacji lub ich przyciemnieniem, w zależności od sposobu, w jaki aplikacje były zapisywane w pamięci podręcznej.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Przycina bufor obrazu z wewnętrznego przedniego aparatu. Jeśli zastępowanie jest wyłączone, przycięcie wewnętrznego przedniego aparatu zostanie usunięte, a pole widzenia na podglądzie z aparatu zostanie zwiększone. Domyślnie na niektórych urządzeniach składanych (patrz urządzenia referencyjne) system przycina podgląd wszystkich aplikacji aparatu, gdy używany jest wewnętrzny przedni aparat.
Inne OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Zapobiega zamazaniu aplikacji, gdy straci ważność w trybie podzielonego ekranu. Aplikacja czeka na zaznaczenie, zanim rysuje jej zawartość. Może to spowodować zablokowanie lub przyciemnienie jej. Zastąpienie pozwala Androidowi wysłać do aplikacji fałszywe zdarzenie zaznaczenia, które sygnalizuje jej, że ponownie rozpoczyna rysowanie treści.

FORCE_RESIZE_APP

Wymusza zmianę rozmiaru pakietów, w których zastosowano zastąpienie. Nie określa, czy aplikację można włączyć w trybie wielu okien, ale umożliwia zmianę rozmiaru aplikacji bez przechodzenia w tryb zgodności z rozmiarem podczas zmieniania rozmiaru ekranu.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

W pliku manifestu aplikacji ustaw atrybut android:resizeableActivity na true lub, aby zmienić rozmiar przy wyłączaniu trybu wielu okien przy użyciu funkcji android:resizeableActivity=false, ustaw flagę metadanych android.supports_size_changes na true.

Optymalizacja aplikacji

Korzystaj z układów elastycznych i adaptacyjnych, aby umożliwić aplikacjom dostosowywanie się do wszystkich rozmiarów i formatów reklam. Zobacz Obsługa różnych rozmiarów ekranów.

Jak wyłączyć lub zrezygnować z zastąpienia

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 włączyć zmianę rozmiaru aplikacji:

adb shell am compat enable FORCE_RESIZE_APP <package>

Aby usunąć zastąpienie:

adb shell am compat disable FORCE_RESIZE_APP <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

FORCE_NON_RESIZE_APP

Wymusza, aby pakiety, do których zostało zastosowane zastąpienie, nie podlegały zmianie rozmiaru i w przypadku zmian konfiguracji włączają tryb zgodności rozmiaru.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

W pliku manifestu aplikacji ustaw zarówno atrybut android:resizeableActivity, jak i flagę metadanych android.supports_size_changes na false i zadeklaruj ograniczenie orientacji lub formatu obrazu.

Optymalizacja aplikacji

Wszystkie aplikacje, które po zmianie rozmiaru działają prawidłowo, powinny mieć wartość android:resizeableActivity lub android.supports_size_changes ustawioną na true. Inne aplikacje powinny działać poprawnie po zmianie rozmiaru. Więcej informacji znajdziesz na stronie android:resizeableActivity.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO

Odstraszacz wszystkich zastąpień, które wymuszają dany minimalny współczynnik proporcji.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

Nie ustawiaj ograniczeń formatu obrazu w aplikacji. Upewnij się, że aplikacja obsługuje różne rozmiary ekranów. Używaj klas rozmiaru okna, aby umożliwić obsługę różnych układów w zależności od ilości miejsca na ekranie aplikacji. Dowiedz się więcej o interfejsach Compose WindowSizeClass API i View WindowSizeClass API.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Ogranicza ustawienia aplikacji, które wymuszają określony minimalny współczynnik proporcji w przypadku aktywności w orientacji pionowej. Ta opcja jest domyślnie włączona i działa tylko wtedy, gdy jest też włączona zasada OVERRIDE_MIN_ASPECT_RATIO.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

Ustawia minimalny współczynnik proporcji aktywności na średnią wartość (3:2)

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Ustawia minimalny współczynnik proporcji aktywności na dużą wartość (16:9)

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Włącza podzielony ekran. Pozwala aplikacji wykorzystać całe dostępne miejsce w trybie podzielonego ekranu, bez czarnych pasów.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Wyłącza minimalne zastępowanie minimalnego formatu obrazu na pełnym ekranie w orientacji pionowej, aby wykorzystywać całe dostępne miejsce na ekranie.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_UNDEFINED_ORIENTATION_DO_PORTRAIT

Umożliwia orientację pionową podczas wszystkich aktywności w pakiecie. Jeśli nie jest włączona opcja OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy działanie nie określiło żadnej innej stałej orientacji.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Ustaw atrybut pliku manifestu activity:screenOrientation lub użyj interfejsu API Activity#setRequestedOrientation().

Optymalizacja aplikacji

Aplikacja powinna obsługiwać wszystkie orientacje. Zmiana orientacji to zmiana konfiguracji, którą można obsłużyć na 2 sposoby: pozwolić systemowi na zniszczenie i odtworzenie aplikacji lub o samodzielne zarządzanie konfiguracją. Jeśli samodzielnie zarządzasz zmianami konfiguracji, stan aplikacji można zachować za pomocą funkcji ViewModel. W bardzo nielicznych przypadkach możesz zablokować orientację tylko na małych ekranach, ale może to nie skalować się i pozwolić użytkownikowi obracać aplikację zgodnie z potrzebami. Na Androidzie 12L i nowszych wersjach stałą orientację można zastąpić przez konfigurację urządzenia. Więcej informacji o obsłudze zmian konfiguracji i wszystkich orientacjach znajdziesz w sekcjach Obsługa zmian konfiguracji, Omówienie modelu widoku danych i Orientacja aplikacji ograniczona na telefonach, ale nie na urządzeniach z dużym ekranem.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_UNDEFINED_ORIENTATION_NA_NOSENSOR

Włącza orientację nosensor dla wszystkich działań w pakiecie. Jeśli zasada OVERRIDE_ANY_ORIENTATION nie jest włączona, zastąpienie jest używane tylko wtedy, gdy działanie nie określiło żadnej innej stałej orientacji.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

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

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Włącza orientację reverseLevel dla wszystkich działań w pakiecie. Jeśli zasada OVERRIDE_ANY_ORIENTATION nie jest włączona, zastąpienie jest używane tylko wtedy, gdy działanie nie określiło żadnej innej stałej orientacji.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

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

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_ANY_ORIENTATION

Umożliwia zastępowanie dowolnej orientacji w celach OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

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

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Limity OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE są stosowane tylko wtedy, gdy połączenie z kamerą jest aktywne.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

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

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Ogranicza orientację ekranu do naturalnej orientacji poziomej, gdy są spełnione te warunki:

  • Aktywność jest wyświetlana na pełnym ekranie
  • Właściwość komponentu Zrezygnuj PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE nie jest włączona
  • Ustawienie żądania ignorowania orientacji przez producenta urządzenia jest włączone dla wyświetlacza.
  • Naturalna orientacja wyświetlacza to pozioma.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

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

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED (PRZEDSTAWIENIE)

Włącza zasadę zgodności, która w odpowiedzi na wywołanie aplikacji ignoruje żądaną orientację w aplikacji Activity#setRequestedOrientation() więcej niż dwa razy na sekundę, jeśli działanie nie ma czarnych pasów w przypadku stałej orientacji.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Wyklucza pakiety z działania ignorowania żądań orientacji, które może włączyć producent urządzeń dla obszaru wyświetlania lub całego wyświetlacza.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.

Optymalizacja aplikacji

Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT.

Jak wyłączyć lub zrezygnować z zastąpienia

Nie można z tego zrezygnować. Wyłączenie zastępowania może być niebezpieczne, jeśli aplikacja jest niezgodna z urządzeniem, na którym włączono ustawienie żądania ignorowania orientacji przez producenta urządzenia. Aby wyłączyć zastępowanie, skontaktuj się z zespołem programistów 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

INTERFEJSY API NEVER_SANDBOX_DISPLAY_API

Wymusza, aby pakiety nigdy nie używały piaskownicy Display w przypadku aktywności w trybie zgodności z czarnymi pasami lub rozmiarem. Interfejsy API Display nadal będą podawać granice obszaru wyświetlania.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zadeklaruj działania z możliwością zmiany rozmiaru, ustawiając atrybut manifestu android:resizeableActivity na true lub flagę metadanych android.supports_size_changes na true.

Optymalizacja aplikacji

Aplikacje, które zadeklarują, że można w pełni zmieniać rozmiar, nie powinny w żadnym przypadku określać pozycji elementów interfejsu na podstawie rozmiaru wyświetlacza. Przenieś aplikację do najnowszych interfejsów API, które zapewniają WindowMetrics. Jeśli korzystasz z Jetpack Compose, skorzystaj z interfejsu API WindowSizeClass, aby narysować UI w oparciu o to, jaką powierzchnię ma aktualnie aplikacja na bieżącym wyświetlaczu. Zobacz Klasy rozmiaru okna.

Jak wyłączyć lub zrezygnować z zastąpienia

Nie można z tego zrezygnować. Migracja 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

ALWAYS_SANDBOX_DISPLAY_APIS

Wymusza w pakietach zawsze stosowanie piaskownicy Display interfejsu API niezależnie od trybu okna. Interfejsy API Display zawsze określają granice aplikacji.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

W aplikacjach, które zadeklarują, że można w pełni zmienić rozmiar, nie należy używać rozmiaru wyświetlacza do określania pozycji elementów interfejsu. Przenieś swoją aplikację z wycofanych interfejsów API do aktualnych interfejsów API, które zapewniają WindowMetrics. Zobacz WindowMetricsCalculator.

Jak wyłączyć lub zrezygnować z zastąpienia

Nie można z tego zrezygnować. Migracja 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Wymusza, aby pakiety te interfejsy API View znajdowały się w piaskownicy względem granic aktywności:

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Rozwiąż ten problem w kodzie aplikacji, korzystając z 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 w aplikacji trybu letterbox i trybu wielu okien. Więcej informacji: WindowMetricsCalculator.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

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

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

Nie korzystaj z orientacji czujnika aparatu w pamięci podręcznej ani informacji o urządzeniu. Wskazówki dotyczące zgodności z aparatem znajdziesz w artykułach Wprowadzenie do wizjera aparatu i Obsługa powierzchni z możliwością zmiany rozmiaru w aplikacji aparatu.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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 wymuszoną rotację:

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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Wyłącza odświeżanie aktywności po wymuszeniu rotacji. poprawia wrażenia użytkowników, gdy odświeżenie powoduje utratę stanu w aplikacjach.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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 wyłącza odświeżanie aktywności:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

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

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Powoduje, że pakiety, w których jest on stosowany do odświeżania aktywności, są odświeżane za pomocą cyklu onResume()onPause()onResume(), a nie onResume()onStop()onResume() po obróceniu siłą zgodności z aparatem.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_CAMERA_LANDSCAPE_DO_PIONOWEJ

Wymusza przycięcie obrazu wyjściowego z aparatu do przeciwnej orientacji, jeśli orientacja pionowa jest niezgodna z naturalną orientacją urządzenia. Wiele aplikacji nie radzi sobie z tą sytuacją i w przeciwnym razie wyświetla rozciągnięte obrazy.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Jak wyłączyć lub zrezygnować z zastąpienia

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

Flagi 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 obejmuje przycięcie wewnętrznego przedniego aparatu:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Aby usunąć zastąpienie, które spowoduje usunięcie przycięcia wewnętrznego przedniego aparatu:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Uniemożliwia aplikacjom rezygnację z udostępniania ekranu aplikacji (patrz Wyświetlanie multimediów). Ma zastosowanie, gdy aplikacje niewłaściwie używają interfejsu API createConfigForDefaultDisplay() do wymuszania przechwytywania pełnego ekranu i narażają prywatność użytkownika przez ujawnianie treści powiadomień (rejestrowanych w trybie pełnoekranowym, ale bez udostępniania ekranu aplikacji) oraz wszystkich aplikacji niezależnie od trybu okna.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

Zezwalaj na domyślne wyświetlanie multimediów (zaimplementowane w Androidzie 14 na poziomie interfejsu API 34 w ramach interfejsu createScreenCaptureIntent()), co umożliwia użytkownikom określenie, czy chcą udostępnić pełny ekran, czy pojedyncze okno aplikacji niezależnie od trybu okna aplikacji. Możesz też wywołać metodę createScreenCaptureIntent(MediaProjectionConfig) z argumentem MediaProjectionConfig zwróconym z wywołania do createConfigForUserChoice().

Optymalizacja aplikacji

Zezwalaj użytkownikom na wybór, czy podczas wyświetlania multimediów udostępnić cały ekran urządzenia czy okno aplikacji – od Androida 14 jest to domyślne zachowanie.

Włącz możliwość zmiany rozmiaru aplikacji (resizeableActivity="true"), aby obsługiwała tryb wielu okien.

Jak wyłączyć lub zrezygnować z zastąpienia

Ze względu na wagę prywatności użytkownika w aplikacji nie można wyłączyć ani zrezygnować z tej zmiany.

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

Brak.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, czyli anulowanie rezygnacji aplikacji z udostępniania części ekranu (czyli włączyć 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 częściowego udostępniania ekranu:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Włącza wysyłanie fałszywych informacji w przypadku niezaznaczonych aplikacji w trybie podzielonego ekranu. Niektóre silniki gier czekają, aż ustawimy ostrość, zanim rysujemy zawartość aplikacji. Dlatego fałszywe fokus pomaga aplikacjom uniknąć zaciemnienia ekranu po wznowieniu, gdy aplikacja jest aktywna.

Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie

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

Optymalizacja aplikacji

Możesz uniknąć tego problemu, jeśli aplikacja dobrze działa w wielu orientacjach i dobrze się zmienia. Przygotuj aplikację na duży ekran, postępując zgodnie ze wskazówkami dotyczącymi jakości aplikacji na dużym ekranie.

Jeśli używasz silnika gry Unity, uaktualnij grę do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. Zostaw zaznaczoną opcję Resizable Window w ustawieniach odtwarzacza Android.

Jak wyłączyć lub zrezygnować z zastąpienia

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: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.

Dodatkowe materiały