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 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: domyślna orientacja niektórych tabletów, takich jak Pixel Tablet, to orientacja pozioma. Urządzenie jest w naturalnej orientacji, gdy Display#getRotation() powraca do Surface.ROTATION_0. Jeśli aplikacje zakładają, że ROTATION_0 to orientacja pionowa, układy aplikacji i podgląd aparatu mogą nie pasować do ekranu 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 rozłożony ekran ma orientację pionową, mogą wystąpić problemy z migotaniem lub pętlami.
  • Składane telefony: rozłożone telefony są zwykle w orientacji pionowej. 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

W trybie Letterbox aplikacja jest umieszczona na środku ekranu lub, w przypadku dużych ekranów, po jednej lub drugiej stronie, aby zapewnić wygodny dostęp. 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.

Letterboxowanie często występuje na urządzeniach z dużym ekranem, ponieważ wymiary i format obrazu na wyświetlaczu są zwykle inne niż w przypadku standardowych telefonów, na które przeznaczona jest większość aplikacji.

Rysunek 1. Aplikacja ograniczona do orientacji pionowej jest wyświetlana w formacie letterbox na tabletach i urządzeniach składanych w orientacji poziomej.

Problem

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

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

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

  • resizeableActivity: wskazuje, czy system może zmieniać rozmiary aplikacji, aby pasowały do okien o różnych wymiarach. W Androidzie 11 (poziom interfejsu API 30) lub starszym określa, czy aplikacje obsługują tryb wielookienkowy. W przypadku Androida 12 (poziom API 31) lub nowszego określa, czy aplikacje obsługują tryb wielookienkowy na małych ekranach (klasa rozmiaru okna). Na Androidzie 12 i nowszych aplikacje obsługują tryb wielu okien na dużych ekranach (klasa średniego lub rozwiniętego rozmiaru okna) niezależnie od tego ustawienia.

  • maxAspectRatio: określa maksymalny współczynnik proporcji obsługiwany przez aplikację. Ustawienie maxAspectRatio mogą zmienić tylko aplikacje, w których parametrze resizeableActivity jest ustawiona 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 oraz tryb wielookienności. Usuń z układów aplikacji i pliku manifestu aplikacji wszystkie ograniczenia orientacji i stałego formatu obrazu.

Obejście dotyczące zgodności

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

Począwszy od Androida 12 (poziom API 31) i później 12L (poziom API 32), platforma wprowadza różne ulepszenia w aplikacji w formacie letterbox. Producenci urządzeń wdrażają ulepszenia interfejsu. Aby skorzystać z tych ulepszeń, nie musisz wprowadzać żadnych dodatkowych zmian w aplikacji.

Android 12 (poziom interfejsu API 31) wprowadza te ulepszenia estetyczne, które mogą być konfigurowane przez producentów urządzeń:

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

Rysunek 2. Aplikacja w Letterboxach z ulepszeniami interfejsu.

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

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

  • Zmieniony przycisk ponownego uruchamiania: producenci urządzeń mogą zmienić wygląd przycisku ponownego uruchamiania w trybie zgodności z rozmiarem, aby ułatwić użytkownikom jego rozpoznawanie.

Android 13 (poziom 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. Ten element sterujący umożliwia użytkownikom ponowne uruchomienie aplikacji i odświeżenie wyświetlacza. Android wywołuje tryb zgodności z rozmiarem w przypadku aplikacji, które nie mogą być zmieniane. Gdy aktywność zostanie przeniesiona do kontenera wyświetlania, który jest niezgodny z jej wymiarami, system może zmienić jej rozmiar, aby wypełnić co najmniej 1 wymiar ekranu urządzenia.

Zmiany konfiguracji urządzenia, które mogą spowodować przejście w tryb zgodności z rozmiarem:

  • Obracanie urządzenia
  • Składanie i rozkładanie składanego urządzenia
  • Przełączanie się między trybami wyświetlania pełnego ekranu i podzielonego ekranu

Problem

Tryb zgodności 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.

Aplikacja jest uznawana za umożliwiającą zmianę rozmiaru i nie jest umieszczana w trybie zgodności z rozmiarem, jeśli spełnia co najmniej 1 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 wyświetlania. Aby umożliwić zmianę rozmiaru aplikacji, w pliku manifestu aplikacji ustaw atrybut android:resizeableActivity elementu <activity> lub <application> na true. Zaprojektuj układy elastyczne lub adaptacyjne dla swojej aplikacji. Więcej informacji znajdziesz w artykułach Obsługa różnych rozmiarów ekranuObsługa trybu wielookiennego.

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 opcję ponownego uruchamiania, która ponownie tworzy proces aplikacji, odtwarza aktywność i ponownie rysuje wyświetlacz. Zobacz też Omówienie procesów i wątków.

migające pętle,

Jeśli aplikacja nie obsługuje wszystkich orientacji ekranu, może wielokrotnie prosić o nowe orientacje po zmianie konfiguracji, tworząc nieskończony cykl, który powoduje migotanie ekranu lub niekończące się obracanie aplikacji.

Problem

W Androidzie 12 (API na poziomie 31) i nowszych producenci urządzeń mogą skonfigurować swoje urządzenia tak, aby ignorowały ograniczenia orientacji określone przez aplikacje, a zamiast tego stosowały tryby zgodności. Na przykład urządzenie składane może zignorować ustawienie android:screenOrientation="portrait" aktywności, gdy jest ona wyświetlana na wewnętrznym ekranie w urządzeniu dotykowym w orientacji poziomej.

Jeśli ograniczenia dotyczące orientacji aplikacji zostaną zignorowane, aplikacja może automatycznie ustawić swoją orientację, wywołując metodę Activity#setRequestedOrientation(). Jeśli aplikacja nie obsługuje zmian konfiguracji (patrz Obsługa zmian konfiguracji), wywołanie powoduje jej ponowne uruchomienie. 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.

Może się to też zdarzyć, gdy naturalna orientacja (czyli zwykła, jak określa ją Android) ekranu urządzenia jest pozioma (czyli wywołanieDisplay#getRotation() zwracaSurface.ROTATION_0, gdy urządzenie ma format obrazu poziomego). Do tej pory aplikacje zakładały, że Display.getRotation() = Surface.ROTATION_0 oznacza, że urządzenie jest w orientacji pionowej, ale nie zawsze tak jest, na przykład na wewnętrznym ekranie niektórych składanych urządzeń i na niektórych tabletach.

Aplikacja w orientacji poziomej na składanym ekranie wewnętrznym może sprawdzić obrót ekranu, otrzymać wartość ROTATION_0, przyjąć, że naturalną orientacją urządzenia jest orientacja pionowa, i wywołać funkcję setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ), aby zmienić układ aplikacji. Po ponownym uruchomieniu aplikacji (w orientacji poziomej) 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ślny kierunek za pomocą Activity#setRequestedOrientation() w metodzie activity onCreate(), ponieważ żądanie dotyczące orientacji może zostać nieoczekiwanie wywołane przez nieobsługiwane zmiany konfiguracji.
  • Zakładamy, że naturalna orientacja urządzenia (ROTATION_0) to orientacja pionowa
  • Ustaw orientację na podstawie sygnałów niezwiązanych z obecnym rozmiarem okna, takich jak Display#getRotation(), obecność FoldingFeature lub wycofane interfejsy API.

Obejście zgodności

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

  • Aktywność została już wznowiona po wcześniejszym wywołaniu tej 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ść wysłała w ciągu 1 sekundy więcej niż 2 żądania orientacji, co wskazuje na wystąpienie pętli. Z 2 żądań w pętli Android używa tego, któ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 czujnika aparatu jest pionowa – jest to rozsądne założenie w przypadku standardowych telefonów komórkowych. Jednak naturalna orientacja tabletów i laptopów oraz ich czujników aparatu może być pozioma. Nowe formaty, takie jak składane urządzenia, mogą mieć wiele naturalnych orientacji i wiele czujników aparatu w różnych orientacjach.

Rozpoczynanie aktywności z orientacją aparatu, której aplikacja nie obsługuje, lub przełączanie się między różnymi kamerami lub ekranami urządzenia (w przypadku składanych urządzeń) może spowodować przesunięcie lub zniekształcenie podglądu aparatu.

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 jest w naturalnej orientacji, 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 orientacja czujnika jest pozioma, a podgląd aparatu – pionowa. Konkretne sposoby obejścia tego problemu to m.in.:

  • Wymuszanie obracania podglądów aparatu w przypadku aplikacji ograniczonych do orientacji pionowej: aplikacje ograniczone do orientacji pionowej oczekują, że naturalna orientacja urządzenia i orientacja czujnika aparatu będą pionowe. 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 aplikacja z ograniczeniami dotyczącymi orientacji pionowej jest połączona z aparatem, Android wymusza jej obrócenie, aby dopasować okno aplikacji do naturalnej orientacji urządzenia.

    Na niektórych tabletach (patrz urządzenia referencyjne) okno aplikacji w orientacji pionowej jest 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 wewnętrznym ekranie w orientacji poziomej składanych urządzeń (patrz urządzenia referencyjne) aktywności przeznaczone tylko do trybu pionowego są obracane w poziom, aby dopasować je do naturalnej orientacji po rozłożeniu. Po wymuszeniu rotacji aplikacja ma czarne pasy.

  • Przycinanie wewnętrznego aparatu przedniego: w przypadku niektórych składanych urządzeń czujnik wewnętrznego aparatu przedniego jest w orientacji poziomej. 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 zastąpienie na poziomie aplikacji OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE) po wymuszeniu, by podgląd z kamery wyświetlał się prawidłowo.

  • Skalowanie formatu obrazu: system dynamicznie zmienia format obrazu podglądu wymuszonego obrotu kamery na większy format obrazu, co zapewnia prawidłowe skalowanie podglądu.

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

Interfejsy API, których użytkownicy często nadużywają

Android obsługuje teraz takie funkcje jak tryb wielozadaniowości i urządzenia składane, dlatego starsze interfejsy API zostały wycofane i zastąpione nowszymi, które działają na wszystkich rozmiarach ekranów i w przypadku wszystkich form czynników urządzeń. 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 rozumiane przez deweloperów.

Problem

Deweloperzy nadal używają wycofanych interfejsów API Display i nieprawidłowo zakładają, że interfejsy API zwracają granice aplikacji zamiast granic obszaru wyświetlania urządzenia. Może też być tak, że deweloperzy używają interfejsów API widoku do celów specjalnych, aby uzyskać ogólne dane wyświetlania. W efekcie po zmianie rozmiaru okna aplikacji dochodzi do błędów w przemieszczaniu elementów interfejsu, co powoduje problemy z układem.

Wycofane i często niewłaściwie używane interfejsy Display API:

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

Niewłaściwe użycie interfejsów API wyświetlania:

Optymalizacja

Nigdy nie licz na to, że rozmiar fizycznego wyświetlacza wystarczy do pozycjonowania elementów interfejsu. Przeprowadź migrację aplikacji na interfejsy API oparte na WindowMetrics, w tym na te interfejsy WindowManager:

obejście problemu dotyczącego zgodności,

2 zastąpienia dostosowują wycofane interfejsy API Display i niewłaściwie używane interfejsy API View, aby zwracać granice aplikacji: ALWAYS_SANDBOX_DISPLAY_APIS dla interfejsów API Display; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS dla interfejsów API View. Ustawienie ALWAYS_SANDBOX_DISPLAY_APIS jest też domyślnie stosowane do aplikacji, które kwalifikują się do trybu zgodności rozmiaru.

przejrzyste działania,

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>

Tematy związane z dialogami, takie jak Theme.MaterialComponents.Dialog, mogą zawierać style, które czynią działania przejrzystymi.

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

Przeźroczysta aktywność powinna być zgodna z granicami pierwszej nieprzezroczystej aktywności poniżej niej w stosie działań zadania. Jednak nieprzejrzysta aktywność, która uruchamia okno z prośbą o przyzwolenie, może być trampolinem (czyli aktywnością, która uruchamia inną aktywność, a potem znika). W takim przypadku system nie może określić granic aktywności trampoline, która uruchomiła przejrzystą aktywność z prośbą o przyzwolenie.

Optymalizacja

Aktywności przejrzyste dziedziczą ograniczenia od najbardziej nieprzezroczystej aktywności znajdującej się poniżej nich w zestawie aktywności zadania. Aktywność nieprzezroczysta musi być dostępna przez cały cykl życia aktywności przejrzystej, od jej utworzenia do usunięcia. Z tego powodu nie wysyłaj próśb o udzielenie uprawnień z aktywności na trampolinie.

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 wysyłać prośby o uprawnienia z działań, które pozostają widoczne, dopóki użytkownik nie podejmie decyzji.

Zaokrąglone rogi

Aktywność może być przezroczysta, ponieważ styl określa przezroczystość tła lub dlatego, że zawartość aktywności nie wypełnia dostępnej przestrzeni wyświetlania. Jeśli przezroczysta aktywność wypełnia dostępną przestrzeń na ekranie, system automatycznie zaokrągla rogi tej aktywności, jeśli producent urządzenia skonfigurował ją w ten sposób. Jeśli jednak działanie przezroczyste (np. okno zezwoleń) nie wypełni dostępnego miejsca, Ty decydujesz, czy zastosować zaokrąglone narożniki.

Dialogi z prośbą o uprawnienia nie wypełniają dostępnej przestrzeni wyświetlania, ponieważ ich układ zwykle używa LayoutParams.WRAP_CONTENT zamiast LayoutParams.MATCH_PARENT.

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 Unity

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 wersji Unity 2019.4 dodano opcję Resizable Window, aby umożliwić korzystanie z trybu wielookiennego na Androidzie. 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 renderuje czarny ekran lub ostatnią zamrożoną klatkę gry. 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ę. Pozostaw zaznaczoną opcję Resizable Windowustawieniach odtwarzacza Androida, w przeciwnym razie gra zostanie wstrzymana, gdy nie będzie aktywna, mimo że będzie w pełni widoczna w trybie wielookiennym.

obejście problemu dotyczącego zgodności,

Producenci urządzeń mogą stosować zastąpienie OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS na poziomie aplikacji, aby zapewnić fałszywe zdarzenie focus w aplikacji w trybie wielozadaniowym. 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 zachowanie 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. W Androidzie 14 (poziom interfejsu API 34) i nowszych użytkownicy mogą stosować zastąpienia w aplikacjach za pomocą ustawień urządzenia.

Zastąpienia użytkownika w przypadku poszczególnych aplikacji

W Androidzie 14 i nowszych użytkownicy mogą zmieniać format obrazu aplikacji w menu ustawień. Menu są stosowane na dużych ekranach, np. na urządzeniach referencyjnych.

Menu zawiera listę wszystkich aplikacji zainstalowanych na urządzeniu. Użytkownicy wybierają aplikację, a następnie ustawiają jej proporcje na 3:4, 1:1, pełny ekran lub inną wartość skonfigurowaną przez producenta urządzenia. Użytkownicy mogą też zresetować format obrazu do domyślnego, który jest określony w pliku manifestu aplikacji.

Aplikacje mogą zrezygnować z zastąpienia zgodności, ustawiając te tagi PackageManager.Property:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    Aby zrezygnować z zastę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 zmienić formatu obrazu aplikacji.

    Ustawienie tej właściwości na true nie ma żadnego wpływu.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

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

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

    Opcja pełnego ekranu zostanie usunięta z listy opcji formatu obrazu w ustawieniach urządzenia. Użytkownicy nie będą mogli zastosować zastąpienia pełnoekranowego w Twojej aplikacji.

    Ustawienie tej właściwości na true nie ma żadnego 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ń stosują zastąpienia na poziomie aplikacji na wybranych urządzeniach. Urządzenia referencyjne mogą domyślnie stosować niektóre zastąpienia do różnych aplikacji.

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

Za pomocą platformy zgodności możesz przetestować aplikację z włączonymi lub wyłączonymi zastąpieniami (patrz Narzędzia platformy zgodności). Gdy ta opcja jest włączona, zastąpienia mają zastosowanie do całej aplikacji.

Możesz też użyć Android Debug Bridge (adb), aby włączyć lub wyłączyć zastąpienia i określić, które zastąpienia mają zastosowanie do Twojej aplikacji.

Włącz lub wyłącz zastąpienia w ten sposób:

adb shell am compat enable/disable <override name/id> <package>

W przypadku urządzeń referencyjnych sprawdź, które zastąpienia mają zastosowanie do Twojej aplikacji:

adb shell dumpsys platform_compat | grep <package name>

Tabela poniżej zawiera listę dostępnych zastąpień oraz wskazówki, jak zoptymalizować aplikację, aby nie musiała ona korzystać z zastąpień. Możesz dodać do pliku manifestu aplikacji flagi właściwości, aby zrezygnować z niektórych override’ów.

Zastąpienia na poziomie aplikacji
Typ Nazwa ID Opis
Możliwość zmiany rozmiaru FORCE_RESIZE_APP 174042936 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 w Gatekeeper, które musi być włączone, aby zastosować inne zastąpienia formatu obrazu.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Jeśli ta opcja jest włączona (domyślnie), limity zastępują zakres tylko do aktywności w orientacji pionowej.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 Zmień minimalne proporcje 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_ANY_ORIENTATION 265464455 Umożliwia zastąpienie dowolnej orientacji.
OVERRIDE_ANY_ORIENTATION_TO_USER 310816437 Zastępuje ograniczenia dotyczące orientacji, zmiany rozmiaru i współczynnika proporcji obrazu.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Zastępuje orientację pionową, gdy aktywność ma nieokreśloną orientację.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Zastępuje orientację nosensor (użyj naturalnej orientacji urządzenia) wtedy, gdy aktywność ma nieokreśloną orientację.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Obróci aplikacje tylko w układzie poziomym o 180 stopni.
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 Gdy zadanie jest wyświetlane na pełnym ekranie (w tym w trybie letterbox), wyświetlacz ustawia się na stałą orientację poziomą.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Ignoruje żądania dotyczące orientacji z aplikacji, aby uniknąć nieskończonych pętli obracania.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Ignoruje powtarzające się prośby o orientację podczas ponownego uruchamiania działania. Jeśli Android wykryje, że aplikacja w ciągu 1 sekundy prosi o co najmniej 2 nowe orientacje, system uzna to za nieskończony cykl obracania i zastosuje zastąpienie.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Zapobiega letterboxingowi przez wyłączenie ustawienia ignorowania prośby o orientację przez producenta urządzenia.
Interfejsy API piaskownicy NEVER_SANDBOX_DISPLAY_APIS 184838306 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 na interfejsach API View używanych w aplikacji zwracanie granic aplikacji. Interfejsy API View zwracają logiczne granice obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API View zwracają granice aplikacji, co prowadzi do problemów z interfejsem.
Zgodność z aparatem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Wyłącza wymuszony obrót. Domyślnie wszystkie aplikacje aparatu z ustawionymi orientacjami są wymuszająco obracane, gdy otwarta jest podgląd aparatu.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Usuwa domyślne twarde odświeżanie stosowane, gdy podgląd aparatu jest wymuszająco obracany.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Przełącza twarde odświeżanie na miękkie odświeżanie, gdy podgląd aparatu jest wymuszająco obracany, co pomaga zachować stan podczas wymuszonej rotacji. Domyślnie Android stosuje odświeżanie twarde, gdy podgląd aparatu jest wymuszająco obracany. Twarde odświeżenie może spowodować problemy z utratą stanu aplikacji lub zaciemnieniem ekranu w zależności od tego, jak aplikacje zapisały poprzedni stan w pamięci podręcznej.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Przycina bufor obrazu z wewnętrznego przedniego aparatu. Jeśli zastąpienie jest wyłączone, przycinanie wewnętrznego przedniego aparatu zostanie usunięte, a pole widzenia podglądu aparatu zostanie powiększone. Domyślnie na niektórych urządzeniach składanych (patrz urządzenia referencyjne) system przycina podgląd wszystkich aplikacji aparatu, gdy jest używany wewnętrzny przedni aparat.
Różne OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Zapobiega czarnemu kolorowi aplikacji, gdy straci ważność w trybie podzielonego ekranu. Aplikacja czeka na skupienie uwagi przed wyświetleniem treści, co może spowodować jej zawieszenie lub przyciemnienie. 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 możliwość zmiany rozmiaru pakietów, do których zastosowano zastąpienie. Nie wpływa na to, czy aplikacja może być uruchamiana w trybie wielookiennym, ale pozwala jej zmieniać rozmiar bez przechodzenia w tryb zgodności z rozmiarem ekranu.

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

W manifeście 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 ekranu.

Jak wyłączyć lub wyłączyć zastąpienie

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

Flagi właściwości do dostosowania zastępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie i zmienić rozmiar 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ąć ten sam efekt co 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 być ulepszone, aby dobrze działały po zmianie rozmiaru. Zobacz android:resizeableActivity.

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

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

Flagi właściwości do dostosowania zastępowania

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

Polecenia adb do testowania zastąpienia

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

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

Aby usunąć zastąpienie:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

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

OVERRIDE_MIN_ASPECT_RATIO

Bramka dla wszystkich zastąpień, które narzucają określony minimalny format obrazu.

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

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

Jak optymalizować aplikacje

Nie ustawiaj ograniczeń formatu obrazu w swojej aplikacji. Upewnij się, że aplikacja obsługuje różne rozmiary ekranów. Używaj klas rozmiarów okien, aby obsługiwać różne układy w zależności od ilości miejsca, jaką aplikacja ma na ekranie. Zapoznaj się z interfejsami API Compose WindowSizeClassView WindowSizeClass.

Jak wyłączyć lub wyłączyć zastąpienie

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 tylko tymczasowo stosują lub usuwają zastąpienie.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Ogranicza ustawienia aplikacji, które narzucają określony minimalny format obrazu w przypadku aktywności w orientacji pionowej. Domyślnie jest ona włączona i obowiązuje tylko wtedy, gdy włączona jest też 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 tylko tymczasowo stosują lub usuwają zastąpienie.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

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

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

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak optymalizować aplikacje

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Jak wyłączyć lub wyłączyć zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi usług do dostosowania zastępowania

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Uwaga: te polecenia 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ąć ten sam efekt co zastąpienie

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Optymalizacja aplikacji

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

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

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Flagi 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

Umożliwia użycie proporcji ekranu podzielonego. 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ępowania

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Uwaga: te polecenia 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.

Jak optymalizować aplikacje

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

Zobacz OVERRIDE_MIN_ASPECT_RATIO.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

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

OVERRIDE_ANY_ORIENTATION

Włącza te zastąpienia umożliwiające zastąpienie dowolnej 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: pozwalając systemowi na zniszczenie i ponowne utworzenie aplikacji lub samodzielne zarządzanie zmianami konfiguracji. 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. W Androidzie 12L i nowszych wersjach orientacja może zostać zastąpiona przez konfigurację urządzenia. Więcej informacji o obsługiwaniu zmian konfiguracji i obsługiwaniu wszystkich orientacji znajdziesz w artykułach Obsługa zmian konfiguracji, Omówienie ViewModelOgraniczenie orientacji aplikacji na telefonach, ale nie na urządzeniach z dużym ekranem.

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

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

Flagi właściwości do dostosowania zastępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

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

OVERRIDE_ANY_ORIENTATION_TO_USER

Umożliwia aplikacji wypełnienie dostępnego miejsca. Zastępuje wszelkie ograniczenia dotyczące orientacji, możliwości zmiany rozmiaru i proporcji obrazu określone w pliku manifestu aplikacji. Ponadto ignoruje wszystkie połączenia z numerem Activity#setRequestedOrientation().

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

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

  • Ustaw atrybut pliku manifestu android:resizeableActivity na true.

  • Aby umożliwić zmianę rozmiaru aplikacji przy wyłączonym trybie wielu okien za pomocą parametru android:resizeableActivity=false, ustaw flagę metadanych android.supports_size_changes na true. Nie ustawiaj wartości minAspectRatio ani maxAspectRatio.

Optymalizacja aplikacji

Umożliw aplikacji obsługę wszystkich orientacji. Nie ustawiaj specyfikacji screenOrientation w manifeście aplikacji. Obsługuj rozmiary aplikacji, tryb wielookienkowy i wszystkie proporcje ekranu, ustawiając atrybut android:resizeableActivity w pliku manifestu aplikacji na true. Zobacz Obsługa różnych rozmiarów ekranu.

Jak wyłączyć lub wyłączyć zastąpienie

Zobacz OVERRIDE_ANY_ORIENTATION.

Flagi właściwości do dostosowania zastępowania

Zobacz OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Uwaga: te polecenia 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ąć ten sam efekt co zastąpienie

Zobacz OVERRIDE_ANY_ORIENTATION.

Jak optymalizować aplikacje

Zobacz OVERRIDE_ANY_ORIENTATION.

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

Zobacz OVERRIDE_ANY_ORIENTATION.

Flagi usług do dostosowania zastępowania

Zobacz OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

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

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Włącza orientację bez czujnika dla wszystkich aktywności w pakiecie. Jeśli nie włączysz parametru OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa żadnej innej stałej orientacji.

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

Zobacz OVERRIDE_ANY_ORIENTATION.

Optymalizacja aplikacji

Zobacz OVERRIDE_ANY_ORIENTATION.

Jak wyłączyć lub wyłączyć zastąpienie

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 tylko tymczasowo stosują lub usuwają zastąpienie.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Włącza orientację reverseLandscape dla wszystkich aktywności w pakiecie. Jeśli nie włączysz parametru OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa żadnego innego stałego ułożenia.

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

Zobacz OVERRIDE_ANY_ORIENTATION.

Optymalizacja aplikacji

Zobacz OVERRIDE_ANY_ORIENTATION.

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

Zobacz OVERRIDE_ANY_ORIENTATION.

Flagi usług do dostosowania zastępowania

Zobacz OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

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

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Ograniczenia OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR, i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE zastąpień mają zastosowanie tylko wtedy, gdy połączenie z kamerą jest aktywne.

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

Zobacz OVERRIDE_ANY_ORIENTATION.

Jak optymalizować aplikacje

Zobacz OVERRIDE_ANY_ORIENTATION.

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

Zobacz OVERRIDE_ANY_ORIENTATION.

Flagi usług do dostosowania zastępowania

Zobacz OVERRIDE_ANY_ORIENTATION.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

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

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Ogranicza orientację 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ąć ten sam efekt co zastąpienie

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

Optymalizacja aplikacji

Zobacz OVERRIDE_ANY_ORIENTATION.

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

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

Flagi 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 aktualizowanie orientacji aplikacji w odpowiedzi na wywołanie Activity#setRequestedOrientation(), gdy aplikacja jest ponownie uruchamiana lub ma aktywne działanie dotyczące zgodności z aparatami.

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

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

Jak optymalizować aplikacje

Zobacz OVERRIDE_ANY_ORIENTATION.

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

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

Flagi usług do dostosowania zastępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

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

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

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ąć ten sam efekt co zastąpienie

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

Optymalizacja aplikacji

Zobacz OVERRIDE_ANY_ORIENTATION.

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

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

Flagi 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 zachowania ignorowania prośby o zignorowanie orientacji, które może być włączone przez producentów urządzeń w przypadku obszaru ekranu lub całego ekranu.

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

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

Jak optymalizować aplikacje

Zobacz OVERRIDE_ANY_ORIENTATION.

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

Nie ma możliwości rezygnacji. 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ąpienie, skontaktuj się z zespołem ds. relacji z deweloperami Androida.

Flagi właściwości do dostosowania zastępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

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

INTERFEJSY API NEVER_SANDBOX_DISPLAY_API

Wymusza, aby pakiety nigdy nie miały zastosowanego piaskownicy interfejsu API Display w przypadku aktywności w trybie letterbox lub zgodności z rozmiarem. Interfejsy API Display nadal 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.

Jak optymalizować aplikacje

Aplikacje, które deklarują, że można je w pełni zmieniać, nigdy nie powinny polegać na rozmiarze wyświetlacza do pozycjonowania elementów interfejsu. Przeprowadź migrację aplikacji na aktualne interfejsy API, które zapewniają WindowMetrics. Jeśli używasz Jetpack Compose, korzystaj z interfejsu API WindowSizeClass, aby wyświetlać interfejs użytkownika w zależności od tego, jaką część ekranu zajmuje aktualnie wyświetlana aplikacja. Zapoznaj się z sekcją Używanie klas 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 tylko tymczasowo stosują lub usuwają zastąpienie.

ALWAYS_SANDBOX_DISPLAY_APIS

Wymusza, aby pakiety interfejsu API Display były zawsze stosowane do piaskownicy niezależnie od trybu okna. Interfejsy API Display zawsze określają granice aplikacji.

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

Jak optymalizować aplikacje

Aplikacje, które deklarują, że można je w pełni zmieniać, nigdy nie powinny polegać na rozmiarze wyświetlacza do pozycjonowania elementów interfejsu. 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: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Wymusza umieszczenie w piaskownicy tych interfejsów API View:

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

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

Jak optymalizować aplikacje

Aplikacje powinny używać interfejsów API View, biorąc pod uwagę możliwość zastosowania letterboxa i trybu wielu okien. Patrz WindowMetricsCalculator.

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

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

Flagi właściwości do dostosowania zastępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

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

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Wyłącza wymuszoną rotację. Ulepszenie wrażeń użytkowników w niektórych aplikacjach.

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 polegaj na zapisanych w pamięci podręcznej informacjach o orientacji czujnika aparatu ani na informacjach o urządzeniu. Wskazówki dotyczące zgodności z aparatem znajdziesz w artykułach Wprowadzenie do wizjera aparatu i Obsługa powierzchni 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ępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, które usuwa wymuszanie rotacji:

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 tylko tymczasowo stosują lub usuwają zastąpienie.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Wyłącza odświeżanie aktywności po przymusowym obracaniu. 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 usług do dostosowania zastępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, skutkujące usunięciem odświeżenia aktywności:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

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

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

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

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

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ąć ten sam efekt co zastąpienie

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

Jak optymalizować aplikacje

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

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

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

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

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 podejmuje takiej sytuacji 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.

Jak optymalizować aplikacje

Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Jak wyłączyć lub wyłączyć zastąpienie

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). Wdrażane, gdy aplikacje nadużywają interfejsu API createConfigForDefaultDisplay(), aby wymuszać przechwytywanie całego ekranu i narażać prywatność użytkownika, ujawniając zawartość powiadomień, które są przechwytywane w trybie pełnoekranowym, ale nie w trybie udostępniania ekranu aplikacji, oraz wszystkich aplikacji niezależnie od trybu okna.

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

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

Umożliwia użytkownikom wybranie, czy podczas wyświetlania multimediów mają udostępniać cały ekran urządzenia czy okno aplikacji. Od Androida 14 jest to zachowanie domyślne.

Umożliw zmianę rozmiaru aplikacji (resizeableActivity="true"), aby obsługiwała tryb wielookien.

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

Ze względu na poważne znaczenie prywatności użytkownika Twoja aplikacja nie może wyłączyć tej zastępczej funkcji ani zrezygnować z niej.

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

Brak.

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie, które anuluje rezygnację z udostępniania ekranu na części (czyli włącza udostępnianie ekranu na części):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Aby usunąć zastąpienie, które umożliwia aplikacji rezygnację z częściowego udostępniania ekranu:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

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

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Umożliwia wysyłanie fałszywego stanu skupienia w przypadku aplikacji, które nie są w centrum uwagi w trybie podzielonego ekranu. Niektóre silniki gier czekają na uzyskanie fokusa przed narysowaniem zawartości aplikacji. Dzięki temu aplikacje nie pozostają czarne, gdy są wznawiane i jeszcze nie mają fokusa.

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

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

Jak optymalizować aplikacje

Możesz uniknąć tego problemu, jeśli Twoja aplikacja dobrze obsługuje różne orientacje i zmiany konfiguracji. 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ępowania

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

Polecenia adb do testowania zastąpienia

Aby zastosować zastąpienie:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Aby usunąć zastąpienie:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

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

Dodatkowe materiały