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()
zwracaSurface.ROTATION_0
, urządzenie ma swoją naturalną orientację. Jeśli aplikacje zakładają, żeROTATION_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.
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ą funkcjiActivity#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 parametrresizeableActivity
ma wartośćfalse
.minAspectRatio
: określa minimalny współczynnik proporcji obsługiwany przez aplikację.minAspectRatio
można ustawiać tylko w aplikacjach, w których parametrresizeableActivity
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.
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:
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:
- Można zmienić jej rozmiar za pomocą:
resizeableActivity="true"
- Obsługuje tryb obraz w obrazie (PIP).
- jest osadzony;
- ma zastąpienie
FORCE_RESIZE_APP
dla poszczególnych aplikacji stosowane przez producenta urządzenia (właściwości ustawione przez aplikację są ignorowane);
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ścionCreate()
, 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ściFoldingFeature
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()
ionStart()
(domyślnie) lubonPause()
ionResume()
(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
:
Platforma:
Plecak odrzutowy:
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:
- Strumieniowe przesyłanie danych z urządzeń: aby przetestować aplikację na urządzeniach produkcyjnych (w tym na urządzeniach referencyjnych) hostowanych w centrach danych Google, zapoznaj się z artykułem Przesyłanie strumieniowe danych z urządzenia z Androidem w technologii Firebase .
- Emulatory w Android Studio Hedgehog: informacje o tworzeniu emulatorów urządzeń referencyjnych znajdziesz w artykule Tworzenie urządzeń wirtualnych i zarządzanie nimi.
- Emulator Android Studio z możliwością zmiany rozmiaru: informacje o uzyskiwaniu dostępu do urządzeń wirtualnych znajdziesz w artykule Uruchamianie aplikacji za pomocą emulatora Androida.
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_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 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_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_ANY_ORIENTATION
Włącza te zastąpienia umożliwiające zastąpienie dowolnej orientacji:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_NA_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
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_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 wszystkie ograniczenia orientacji, zmiany rozmiaru i współczynnika proporcji określone w manifeście aplikacji. Ignoruje też wszystkie wywołania Activity#setRequestedOrientation()
.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Nie ustawiaj atrybutu pliku manifestu
android:screenOrientation
ani ustawiaj go na"user"
.Ustaw atrybut manifestu
android:resizeableActivity
natrue
.Na małych ekranach, aby umożliwić zmianę rozmiaru aplikacji przy wyłączonym trybie wielu okien za pomocą funkcji
android:resizeableActivity=false
, ustaw flagę metadanychandroid.supports_size_changes
natrue
. Nie ustawiaj wartościminAspectRatio
animaxAspectRatio
.
Optymalizacja aplikacji
Włącz obsługę wszystkich orientacji. Nie ustawiaj specyfikacji screenOrientation
w pliku manifestu aplikacji. Aby włączyć możliwość zmiany rozmiaru aplikacji, tryb wielu okien i wszystkie formaty wyświetlania, ustaw atrybut android:resizeableActivity
w pliku manifestu aplikacji na true
. Zobacz Obsługa różnych rozmiarów ekranów.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi właściwości do dostosowania zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Uwaga: 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
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi właściwości do dostosowania zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Uwaga: 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_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
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: 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_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi właściwości do dostosowania zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Uwaga: 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_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi właściwości do dostosowania zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Uwaga: 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_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 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_ANY_ORIENTATION
.
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_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 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_ANY_ORIENTATION
.
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 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
.
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 zarysuje zawartość aplikacji. Dlatego fałszywe fokus pomaga aplikacjom uniknąć zamazania po wznowieniu, gdy są aktywne.
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
- Wytyczne dotyczące jakości aplikacji na duży ekran
- Wytyczne dotyczące podstawowej jakości aplikacji