Android aktywuje tryb zgodności w przypadku aplikacji, które deklarują ograniczenia w zakresie orientacji lub zmiany rozmiaru. Tryb zgodności zapewnia dopuszczalne działanie aplikacji na urządzeniach z dużymi ekranami, ale korzystanie z nich nie jest optymalne.
Zastąpienia na poziomie aplikacji umożliwiają producentom urządzeń zmienianie działania aplikacji w celu poprawy wygody użytkowników lub zapobiegania awariom aplikacji na dużych ekranach.
Typowe problemy ze zgodnością
Aplikacje mają najczęściej problemy ze zgodnością z powodu ograniczeń dotyczących orientacji aplikacji, możliwości zmiany rozmiaru i formatu obrazu, nieprawidłowej obsługi orientacji podglądu aparatu i niewłaściwie używanych interfejsów API.
Letterboxing
Format letterbox umieszcza aplikację na środku ekranu, a w przypadku dużych ekranów – po jednej lub drugiej stronie, aby ułatwić do niej dostęp. Maty (paski jednokolorowe lub rozmyta tapeta) wypełniają nieużywany obszar wyświetlania wzdłuż boków lub u góry i dołu aplikacji.
Tworzenie czarnych pasów pojawia się często na urządzeniach z dużymi ekranami, ponieważ wymiary i format obrazu wyświetlacza urządzenia zwykle różnią się od tych w standardowych telefonach, na które zaprojektowano większość aplikacji.
Problem
Aplikacja nie obsługuje wszystkich konfiguracji wyświetlania, ponieważ ma stałą orientację lub format obrazu albo nie można jej zmienić.
Ustawienia konfiguracji, które kontrolują orientację aplikacji i możliwość jej zmiany rozmiaru:
screenOrientation
: określa stałą orientację aplikacji. Aplikacje mogą też ustawiać orientację w czasie działania za pomocą elementuActivity#setRequestedOrientation()
.resizeableActivity
: wskazuje, czy system może zmieniać rozmiar aplikacji, aby dopasować je do okien o różnych wymiarach. Na Androidzie 11 (poziom interfejsu API 30) i starszych określa, czy aplikacje obsługują tryb wielu okien. Na Androidzie 12 (poziom interfejsu API 31) i nowszych określa, czy aplikacje obsługują tryb wielu okien na małych ekranach (o rozmiarze < 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 współczynnik proporcji obsługiwany przez aplikację. Tylko aplikacje z parametremresizeableActivity
ustawionym na wartość Fałsz mogą ustawiać wartośćmaxAspectRatio
.minAspectRatio
: określa minimalny format obrazu obsługiwany przez aplikację. Tylko aplikacje z parametremresizeableActivity
ustawionym na wartość Fałsz mogą ustawiać wartośćminAspectRatio
.
Optymalizacja
Aplikacja powinna obsługiwać wszystkie orientacje i rozmiary wyświetlacza urządzenia oraz trybu wielu okien. Usuń wszystkie ograniczenia dotyczące orientacji i stałych formatów obrazu z układów aplikacji i pliku manifestu aplikacji. Więcej informacji znajdziesz w artykule Obsługa różnych rozmiarów ekranu.
Obejście zgodności
Jeśli aplikacja o stałej orientacji lub współczynniku proporcji działa w oknie, w którym nie obsługuje ona bezpośrednio rozmiaru lub orientacji okna, Android dodaje do niej pasy do liter, aby zachować ciągłość działania.
Począwszy od Androida 12 (poziom interfejsu API 31) i dalszego od 12L (poziom API 32) platforma stosuje różne ulepszenia do aplikacji z czarnymi pasami. Producenci urządzeń stosują ulepszenia interfejsu – nie musisz nic więcej robić, aby korzystać z ulepszeń interfejsu aplikacji.
Android 12 (poziom interfejsu API 31) obejmuje te ulepszenia estetyczne, które mogą konfigurować producenci urządzeń:
- Zaokrąglone rogi: rogi okna aplikacji mają bardziej szczegółowy wygląd.
- Przezroczystość paska systemu: paski stanu i nawigacji, które nakładają się na aplikację, są półprzezroczyste, dzięki czemu ikony na paskach są zawsze widoczne nad tłem letterbox.
- Konfigurowany format obrazu: można dostosować format obrazu aplikacji, aby poprawić jej wygląd.
12L (poziom interfejsu API 32) zawiera te usprawnienia funkcjonalne:
- Konfigurowalne pozycjonowanie: w przypadku dużych ekranów producenci mogą umieszczać aplikację po lewej lub prawej stronie wyświetlacza, co ułatwia interakcję.
- Nowy wygląd przycisku ponownego uruchamiania: producenci urządzeń mogą nadać przyciskowi ponownego uruchamiania w trybie zgodności rozmiaru nowy wygląd, aby użytkownicy byli lepiej rozpoznawani.
Android 13 (poziom interfejsu API 33) dodaje okno z informacjami dla użytkownika na temat umiejscowienia aplikacji z czarnymi pasami na ekranie lub dodawania do nich formatu letterbox w trybie podzielonego ekranu:
Tryb zgodności rozmiaru
Tryb zgodności rozmiaru to letterboxing, który obejmuje opcję ponownego uruchamiania. To ustawienie umożliwia użytkownikom ponowne uruchomienie aplikacji i ponowne narysowanie wyświetlacza. Android wywołuje tryb zgodności rozmiaru w przypadku aplikacji, których rozmiar nie jest możliwy. Jeśli aktywność zostanie przeniesiona do kontenera wyświetlacza o niezgodnych wymiarach, system może przeskalować aplikację, aby wypełnić ekran urządzenia w co najmniej 1 wymiarze.
Oto zmiany w konfiguracji urządzenia, które mogą aktywować tryb zgodności rozmiaru:
- Obracanie urządzenia
- Składane urządzenie składane lub rozkładane
- Przełączanie się między trybem pełnoekranowym i podzielonym ekranem
Problem
Tryb zgodności rozmiaru jest zwykle stosowany w przypadku aktywności, których orientacja lub format obrazu jest ograniczona i które są skonfigurowane (lub określone przez system) tak, że nie można ich zmieniać.
Uznaje się, że aplikację można zmieniać rozmiar i nie można jej włączyć w trybie zgodności rozmiaru, jeśli spełnia którekolwiek z tych kryteriów:
Można zmieniać rozmiar w elemencie
resizeableActivity="true"
Obsługuje tryb obraz w obrazie (PIP)
Jest umieszczony
Ma zastąpienie (
FORCE_RESIZE_APP
) dla poszczególnych aplikacji zastosowane przez producenta urządzenia (właściwości ustawione przez aplikację są ignorowane).
Jeśli aplikacja nie spełnia żadnego z warunków, nie można jej zmienić i będzie ją można włączyć w trybie zgodności rozmiaru.
Optymalizacja
Aplikacja powinna obsługiwać wszystkie rozmiary reklam displayowych. Włącz możliwość zmiany rozmiaru aplikacji, ustawiając w manifeście aplikacji wartość atrybutu android:resizeableActivity
elementu <activity>
lub <application>
na „prawda”. Zaprojektuj elastyczne/adaptacyjne układy przeznaczone do Twojej aplikacji. Więcej informacji znajdziesz w artykułach Obsługa różnych rozmiarów ekranu i Obsługa wielu okien.
Obejście zgodności
Android przełącza aplikację w tryb zgodności rozmiaru, gdy system uzna, że wyświetlanie aplikacji z czarnymi pasami można poprawić przez przeskalowanie aplikacji w taki sposób, aby wypełniła okno wyświetlacza w co najmniej 1 wymiarze. System wyświetla element sterujący, który umożliwia odtworzenie procesu aplikacji, a także tworzenie aktywności i ponowne rysowanie wyświetlacza. Zobacz też Omówienie procesów i wątków.
Migoczące pętle
Gdy aplikacja nie obsługuje wszystkich orientacji wyświetlacza, po zmianie konfiguracji może wielokrotnie prosić o nowe orientacje. W ten sposób powstaje nieskończona pętla, która powoduje migotanie wyświetlacza i nieskończone obrót aplikacji.
Problem
W Androidzie 12 (poziom interfejsu API 31) i nowszych producenci mogą konfigurować swoje urządzenia w taki sposób, aby ignorowały ograniczenia orientacji określone przez aplikacje, a zamiast tego stosowały te ograniczenia do obsługi trybów zgodności. Na przykład urządzenie składane może ignorować ustawienie android:screenOrientation="portrait"
, gdy aktywność jest wyświetlana na wewnętrznym ekranie tabletu.
Jeśli ograniczenia dotyczące orientacji aplikacji są ignorowane, aplikacja może automatycznie ustawić jej orientację, wywołując metodę Activity#setRequestedOrientation()
. Wywołanie to powoduje ponowne uruchomienie aplikacji, jeśli aplikacja nie obsługuje zmian konfiguracji (patrz Obsługa zmian konfiguracji). Po ponownym uruchomieniu ograniczenia dotyczące orientacji aplikacji zostaną ponownie zignorowane, aplikacja powtarza wywołanie do setRequestedOrientation()
, powoduje ponowne uruchomienie aplikacji itd. w pętli, która zmienia się automatycznie.
Innym powodem może być sytuacja, w której naturalna orientacja ekranu urządzenia jest ustawiona w orientacji poziomej (zwykła). Wywołanie metody Display#getRotation()
zwraca wtedy wartość Surface.ROTATION_0
, a format obrazu to orientacja pozioma. Wcześniej aplikacje zakładały, że Display.getRotation() = Surface.ROTATION_0
oznacza urządzenie w orientacji pionowej, ale nie zawsze tak jest (np. na wewnętrznym ekranie Pixel Fold i na niektórych tabletach).
Aplikacja w orientacji poziomej na wewnętrznym wyświetlaczu Pixel Fold może sprawdzać obrót ekranu i otrzymywać wartość ROTATION_0
. Przyjmuje, że naturalna orientacja jest pionowa, a następnie wywołuje metodę setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
. Po ponownym uruchomieniu (w orientacji poziomej) aplikacja może ponownie sprawdzić obrót ekranu, otrzymać wartość ROTATION_0
, wywołać setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
itd. w nieskończonej pętli.
Optymalizacja
Aplikacje nie powinny:
- Ustaw domyślną orientację z użyciem
Activity#setRequestedOrientation()
w metodzie aktywnościonCreate()
, ponieważ żądanie orientacji może zostać nieoczekiwanie aktywowane przez nieobsłużone zmiany konfiguracji - Przyjmijmy, że naturalna orientacja urządzenia (
ROTATION_0
) jest pionowa. - Ustaw orientację na podstawie sygnałów niezwiązanych z bieżącym rozmiarem okna, takich jak
Display#getRotation()
, obecność interfejsuFoldingFeature
lub wycofane interfejsy API (patrz poniżej).
Obejście zgodności
Android ignoruje wywołania Activity#setRequestedOrientation()
w tych sytuacjach:
Aktywność została już uruchomiona ponownie w wyniku poprzedniego wywołania metody lub włączono funkcję obrotu w trybie kompatybilności kamery (patrz Podgląd aparatu poniżej).
Producenci urządzeń mogą zastosować ten sposób w aplikacjach z
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
.Aktywność wysłała więcej niż 2 żądania orientacji w ciągu 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ć ten sposób w aplikacjach z
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
.
Podgląd z aparatu
Podgląd aplikacji (lub wizjer) w aplikacjach aparatu może być niewłaściwie wyrównany lub zniekształcony na tabletach, laptopach i składanych wyświetlaczach.
Problem
Zgodnie z definicją zgodności z Androidem czujnik obrazu w aparacie „MUSI być zorientowany tak, aby jego długość była zgodna z długością ekranu”.
Aplikacje często zakładają, że orientacja urządzenia i czujnika aparatu mają orientację pionową – w przypadku standardowych telefonów komórkowych założenie jest uzasadnione. Tablety i laptopy oraz ich czujniki w ich naturalnej orientacji mogą mieć orientację poziomą. Ponadto nowe urządzenia, takie jak urządzenia składane, mogą mieć wiele naturalnych orientacji i różne czujniki aparatu.
Rozpoczęcie aktywności w nieoczekiwanej orientacji aplikacji lub przełączanie się między różnymi aparatami lub ekranami urządzeń (w przypadku urządzeń składanych) może spowodować niewłaściwie wyrównany lub zniekształcony podgląd aparatu.
Optymalizacja
Aby wyświetlać prawidłowo wyrównany i skalowany podgląd aparatu, aplikacje aparatu muszą poprawnie rozpoznawać orientację urządzenia i orientację czujnika aparatu oraz nimi zarządzać. Aplikacje muszą obliczyć obrót urządzenia, obrót czujnika oraz współczynnik proporcji ekranu lub okna, a potem zastosować wyniki do podglądu 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. W przypadku aplikacji, w których można korzystać z aplikacji w orientacji pionowej, Android dopasowuje okno w orientacji pionowej do naturalnej orientacji urządzenia, czego oczekuje większość aplikacji. Jeśli czujnik ma orientację poziomą, a podgląd aparatu jest pionowy, Android przycina też obraz z czujnika aparatu. Można go obejść w następujący sposób:
Wymuszaj obrót podglądu aparatu w aplikacjach z ograniczeniem orientacji pionowej: aplikacje, które można wyświetlać tylko w orientacji pionowej, powinny mieć naturalną orientację urządzenia, a czujnik aparatu – pionową. Jednak na Androidzie 12 (poziom interfejsu API 31) i nowszych aplikacje mogą działać w różnych orientacjach urządzenia, jeśli producenci ignorują specyfikację.
Gdy z aparatem podłączysz aplikację o ograniczeniu wyświetlania w pionie, Android wymusza obracanie aplikacji, aby dopasować ją do naturalnej orientacji urządzenia.
Na urządzeniu Pixel Tablet okno aplikacji jest obrócone do orientacji pełnoekranowej w orientacji pionowej. Po wymuszeniu obrotu aplikacja zajmuje pełny ekran.
Na wewnętrznym ekranie urządzenia Pixel Fold czynności wykonywane tylko w orientacji pionowej są obracane do poziomu poziomego, aby dopasować się do naturalnej orientacji rozłożonej. Po wymuszeniu rotacji aplikacja ma czarne pasy.
Przycinanie wewnętrznego przedniego aparatu: czujnik wewnętrznego przedniego aparatu w Pixel Fold jest w orientacji poziomej. Oprócz wymuszania obracania podglądu aparatu na wewnętrznym wyświetlaczu Pixel Fold Android przycina pole widzenia wewnętrznego przedniego (poziomego) aparatu, tak aby czujnik rejestrował widok odwrotny do orientacji urządzenia.
Wymuś odświeżanie podglądu aparatu: po wymuszeniu obracania podgląd aparatu przełącza się między metodami aktywności
onStop()
ionStart()
(domyślnie) lubonPause()
ionResume()
(stosowanymi przez OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE do poszczególnych aplikacji).Skalowanie współczynnika proporcji: system dynamicznie zmienia proporcje obrazu w wymuszonym obróceniu podglądu aparatu, aby uzyskać wyższy minimalny format obrazu. Dzięki temu podgląd z aparatu jest prawidłowo skalowany.
Deweloperzy aplikacji mogą zastąpić te obejścia, jeśli aplikacje poprawnie obsługują podgląd z aparatu. Zobacz sekcję Zastąpienia dla poszczególnych aplikacji poniżej.
Najczęściej używane interfejsy API
Ponieważ Android dodał obsługę takich funkcji jak tryb wielu okien i urządzenia składane, starsze interfejsy API zostały wycofane i zastąpione najnowszymi interfejsami API, które działają ze wszystkimi rozmiarami wyświetlaczy i formatami urządzeń. Wycofane interfejsy API nadal są jednak dostępne na potrzeby zgodności wstecznej.
Niektóre interfejsy API View
są zaprojektowane do celów specjalnych, które nie zawsze są dobrze znane deweloperom.
Problem
Deweloperzy nadal korzystają z wycofanych interfejsów API Display
i niewłaściwie zakładają, że zwracają one granice aplikacji, a nie obszaru wyświetlania urządzenia. Z kolei deweloperzy przez pomyłkę używają specjalnych interfejsów API widoku danych, aby uzyskać ogólne dane o sieci reklamowej. Efektem są błędne obliczenia podczas zmiany położenia elementów interfejsu po zdarzeniach zmiany rozmiaru okna aplikacji, które powodują problemy z układem.
Wycofane i często niewłaściwie używane interfejsy API w sieci reklamowej:
Więcej informacji znajdziesz w artykule Obsługa wielu okien.
Niewłaściwie użyte interfejsy View API:
Optymalizacja
Nigdy nie polegaj na fizycznym rozmiarze wyświetlacza przy pozycjonowaniu elementów interfejsu. Przenieś swoją aplikację do interfejsów API opartych na WindowMetrics
, w tym tych WindowManager
:
- Platforma:
- Jetpack:
Obejście zgodności
Dwa zastąpienia dostosowują wycofane interfejsy API Display
i niewłaściwie użyto interfejsów API View
, aby zwracać wartości granic aplikacji: ALWAYS_SANDBOX_DISPLAY_APIS
dla interfejsów API Display
i OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
dla interfejsów API View
. Atrybut ALWAYS_SANDBOX_DISPLAY_APIS
jest też domyślnie stosowany w aplikacjach, które kwalifikują się do trybu zgodności rozmiaru.
Działania oczywiste
Działania przezroczyste są wynikiem stosowania przezroczystych stylów tła, na przykład:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Motywy powiązane z oknami, takimi jak Theme.Material.Dialog
, mogą obejmować style, które zapewniają przejrzystość aktywności.
Aktywności przezroczyste nie obejmują całej dostępnej przestrzeni wyświetlania. Utrudnia to obsługę na dużych ekranach, ponieważ dostępny obszar wyświetlania może się zmieniać w zależności od konfiguracji urządzenia, np. obracania, składania i rozkładania oraz trybu wielu okien.
Problem
Na dużych ekranach aktywność przezroczysta powinna mieścić się w granicach pierwszej nieprzejrzystej aktywności poniżej aktywności przezroczystej w stosie aktywności zadań. Nieprzejrzystą aktywnością, która uruchamia okno uprawnień, może być jednak trampoliną (działaniem uruchamiającym inne działania), która znika po uruchomieniu okna. Tak więc system nie może określić granic przezroczystej aktywności pod aktywnością przezroczystą.
Optymalizacja
Aktywności półprzezroczyste dziedziczą ograniczenia od najbardziej nieprzejrzystej aktywności znajdującej się poniżej niej w stosie działań. Aktywność półprzezroczysta musi być dostępna przez cały cykl życia tej aktywności, od jej utworzenia do zniszczenia. Z tego powodu nie należy wysyłać próśb o przyznanie uprawnień podczas aktywności na trampolinie.
Jeśli aktywność na trampolinie uruchomi prośbę o przyznanie uprawnień, użytkownik może nie zobaczyć okna uprawnień, ponieważ aktywność na trampolinie została zniszczona, zanim użytkownik zareaguje na to okno.
Aplikacje powinny zawsze uruchamiać prośby o przyznanie uprawnień z aktywności, które pozostają widoczne do czasu, aż użytkownik dokona wyboru.
Zaokrąglone narożniki
Aktywność może być przezroczysta, jeśli użyjesz półprzezroczystego motywu lub niewypełniając dostępnego miejsca. Jeśli dostępną przestrzeń reklamową wypełnia półprzezroczysta aktywność, system automatycznie zastosuje do niej zaokrąglone rogi (o ile została tak skonfigurowana przez producenta urządzenia). Jeśli jednak półprzezroczyste działanie (np. okno uprawnień) nie wypełni dostępnego miejsca, to Ty decydujesz, czy chcesz zastosować zaokrąglone narożniki.
Okna z uprawnieniami nie wypełniają dostępnej przestrzeni, ponieważ w ich układzie zwykle używany jest element LayoutParams.WRAP_CONTENT zamiast LayoutParams.MATCH_PARENT.
Obejście zgodności
Aktywności, które uruchamiają działania w oknie, powinny być widoczne, dopóki użytkownik nie odpowie na to okno.
System sprawdza, czy przezroczyste działanie dziedziczy wszystkie ograniczenia z pierwszej nieprzejrzystej aktywności w stosie aktywności przezroczystej, w tym ograniczenia związane z:
- Tryb zgodności rozmiaru
- Orientacja
- Format obrazu
Gry związane z Unity
Gry w Unity działają na pełnym ekranie lub w trybie wielu okien Androida. Wiele gier na Unity traci jednak koncentrację i przestaje rysować, gdy aplikacja działa w trybie wielu okien.
Problem
Od wersji Unity 2019.4 firma Unity dodała opcję Resizable Window
, aby obsługiwać tryb wielu okien na Androidzie. Jednak początkowa implementacja nie zareagowała prawidłowo na cykl życia aktywności w trybie wielu okien, przez co UnityPlayer zawieszało odtwarzanie, gdy aplikacja przestała być aktywna. Gracz wyrenderował czarny ekran lub ostatnią, zablokowaną klatkę w grze. Gra została wznowiona dopiero po dotknięciu ekranu. Ten problem pojawia się w wielu aplikacjach korzystających z silnika Unity i w trybie wielu okien renderuje się jako czarne okno.
Optymalizacja
Uaktualnij Unity do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. Pozostaw zaznaczoną opcję Resizable Window
w ustawieniach Android Playera. W przeciwnym razie gra zatrzyma się, gdy nie jest zaznaczona, mimo że gra jest w pełni widoczna w trybie wielu okien.
Obejście zgodności
Producenci urządzeń mogą zastosować zastępowanie OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
dla poszczególnych aplikacji, aby zapewnić fałszywe zdarzenie skupienia w aplikacji w trybie wielu okien. Zastąpienie umożliwia ponowne przerysowanie treści przez aktywność i nie jej zamazanie.
Testowanie zgodności 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ądzenia: jeśli chcesz przetestować aplikację na urządzeniach produkcyjnych (w tym Pixel Tablet i Pixel Fold) hostowanych w centrach danych Google, przeczytaj artykuł Przesyłanie strumieniowe urządzeń z Androidem z Android Studio.
- Emulatory Pixel Tablet i Pixel Fold w Android Studio Hedgehog: informacje o tworzeniu emulatorów dla urządzeń Pixel Tablet i Pixel Fold 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 przy użyciu emulatora Androida.
Ma czarne pasy
Sprawdź, czy każda aktywność może korzystać z całego miejsca dostępnego dla aplikacji. Najpierw zadeklaruj w folderze testowym ten kod:
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 przeprowadź test, aby potwierdzić działanie i upewnić się, że aktywność docelowa 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 ActivityScenarioRulerule = new ActivityScenarioRule<>(MainActivity.class); public void activity_launched_notLetterBoxed() { try (ActivityScenario scenario = ActivityScenario.launch(MainActivity.class)) { scenario.onActivity(activity -> { assertThat(isLetterboxed(activity)).isFalse(); }); } }
Takie testy najlepiej przeprowadzać tylko do momentu, aż zakończy się ich pozytywny etap i nie potwierdzi, że aktywność w aplikacji zajmuje całe dostępne dla niej miejsce wyświetlania. Przetestuj aplikację na wszystkich typach urządzeń, by zapewnić spójne działanie aplikacji.
Zastąpienia na poziomie aplikacji
Android udostępnia zastąpienia, które zmieniają skonfigurowane działanie aplikacji. Na przykład zastąpienie FORCE_RESIZE_APP
nakazuje systemowi pominięcie trybu zgodności rozmiaru i zmianę rozmiaru aplikacji w taki sposób, aby pasowała do wymiarów displayowych, nawet jeśli w manifeście aplikacji ustawiono resizeableActivity="false"
.
Producenci urządzeń stosują zastąpienia w wybranych aplikacjach na określonych urządzeniach z dużymi ekranami. Na Androidzie 14 (poziom interfejsu API 34) i nowszych użytkownicy mogą stosować zastąpienia w aplikacjach w ustawieniach urządzenia.
Zastąpienia poszczególnych użytkowników w poszczególnych aplikacjach
Na urządzeniach z Androidem 14 i nowszym menu ustawień pozwala użytkownikom zmieniać format obrazu aplikacji. Menu obsługuje się na urządzeniach z dużym ekranem, takich jak Pixel Tablet i Pixel Fold.
Menu zawiera listę wszystkich aplikacji zainstalowanych na urządzeniu. Użytkownicy wybierają aplikację i ustawiają jej format obrazu na 3:4, 1:1, pełny ekran lub inną wartość skonfigurowaną przez producenta urządzenia. Użytkownicy mogą też zresetować współczynnik proporcji do wartości domyślnej aplikacji określonej w pliku manifestu.
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 zastępowania zgodności współczynnika proporcji obrazu użytkownika, dodaj tę właściwość do pliku manifestu aplikacji i ustaw wartość na
false
:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
Twoja aplikacja zostanie wykluczona z listy aplikacji w ustawieniach urządzenia. Użytkownicy nie będą mogli zastąpić formatu obrazu aplikacji.
Ustawienie właściwości na
true
niczego nie zmieni.
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
Aby zrezygnować z trybu pełnoekranowego w ramach zastępowania zgodności formatu obrazu użytkownika, dodaj tę właściwość do pliku manifestu aplikacji i ustaw 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 zastępować ustawień pełnego ekranu w Twojej aplikacji.
Ustawienie dla tej właściwości ustawienia
true
nie spowoduje żadnego efektu.
Zoptymalizuj aplikację pod kątem dużych ekranów: nie ustawiaj w aplikacji ograniczeń dotyczących formatu obrazu. Użyj klas rozmiarów okien, aby obsługiwać różne układy w zależności od ilości dostępnego miejsca na wyświetlacz.
Zastąpienia producenta urządzenia na podstawie aplikacji
Producenci urządzeń stosują zastąpienia dla poszczególnych aplikacji i niektórych urządzeń. Pixel Tablet i Pixel Fold domyślnie stosują niektóre zastąpienia w różnych aplikacjach.
Aplikacje mogą zrezygnować z większości zastąpień (patrz tabela Zastąpienia dla poszczególnych aplikacji poniżej).
Aplikację z włączonymi lub wyłączonymi zastąpieniami możesz przetestować za pomocą platformy zgodności (więcej informacji znajdziesz w artykule o narzędziach platformy zgodności). Gdy ta opcja jest włączona, zastąpienia będą miały zastosowanie do całej aplikacji.
Możesz też użyć narzędzia 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ń Pixel Tablet i Pixel Fold 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 dotyczące optymalizacji aplikacji w taki sposób, aby nie wymagała ona zastąpienia. Aby zrezygnować z niektórych zastąpień, możesz dodać do pliku manifestu aplikacji flagi usługi.
Zastąpienia na poziomie aplikacji | |||
---|---|---|---|
Typ | Nazwa | ID | Opis |
Możliwość zmiany rozmiaru | FORCE_RESIZE_APP | 174042936 | Pomija tryb zgodności rozmiaru w przypadku aplikacji po zmianie konfiguracji. |
FORCE_NON_RESIZE_APP | 181136395 | Po zmianie konfiguracji wymusza na aplikacji tryb zgodności rozmiaru. | |
Format obrazu | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Zastępowanie bramy, które musi być włączone, aby można było zastosować inne zastąpienia formatu obrazu. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | Jeśli ta opcja jest włączona (ustawienie domyślne), limity zastępują zakres tylko w przypadku aktywności 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 były wyświetlane na pełnym ekranie, gdy urządzenie jest ustawione pionowo. | |
Orientacja | OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | Zastępuje orientację pionową, gdy aktywność ma niezdefiniowaną orientację. |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR (OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR) | 265451093 | Zastępuje orientację nosensor (użyj naturalnej orientacji urządzenia), gdy aktywność ma niezdefiniowaną orientację. |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | Obraca aplikacje tylko w orientacji poziomej o 180 stopni. | |
OVERRIDE_ANY_ORIENTATION | 265464455 | Umożliwia zastąpienie dowolnej orientacji. | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | Ogranicza zakres zastępowania orientacji do czasu podłączenia aplikacji do kamery. | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | Ustawia na pełnym ekranie stałą naturalną orientację poziomą (także z czarnymi pasami). | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Ignoruje żądania orientacji wysyłane przez aplikację, aby uniknąć zapętleń obrotu. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | Ignoruje powtarzające się prośby o orientację podczas ponownego uruchamiania aktywności. Jeśli Android wykryje, że aplikacja prosi o co najmniej 2 nowe orientacje w ciągu 1 sekundy, system uzna to za pętlę i zastępuje zastąpienie. | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION (OVERRIDE_RESPECT_REQUESTED_ORIENTATION) | 236283604 | Zapobiega tworzeniu czarnych pasów dzięki wyłączeniu ustawienia ignorowania żądań orientacji urządzenia przez producenta urządzenia. | |
Interfejsy API piaskownicy | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Uniemożliwia zmianę działania interfejsów API wyświetlania. |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Wymusza, by interfejsy API Display w aplikacji zwracały wartości graniczne aplikacji. Interfejsy Display API zwracają granice obszaru wyświetlania, ale czasami aplikacja zakłada te wartości, co prowadzi do problemów z interfejsem. |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Wymusza, aby interfejsy API View używane w aplikacji zwracały wartości graniczne aplikacji. Interfejs API widoku danych zwraca granice obszaru wyświetlania, ale czasami aplikacja zakłada, że wartości interfejsu API widoku danych zwracają wartości aplikacji, co prowadzi do problemów z interfejsem użytkownika. |
|
Kompatybilność z aparatem | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Wyłącza wymuszanie obrotu. Domyślnie wszystkie aplikacje z aparatem o stałej orientacji mają obracanie się po otwarciu podglądu aparatu. |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | Usuwa domyślne twarde odświeżanie stosowane, gdy wymuszony jest obrócenie podglądu aparatu. | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Przełącza twarde odświeżanie na łagodne, gdy wymuszony jest obrócenie podglądu aparatu, co pomaga zachować stan podczas wymuszonego obrotu. Domyślnie Android stosuje twarde odświeżanie, gdy wymuszony jest obrócenie podglądu aparatu. Twarde odświeżanie może powodować problemy, w zależności od sposobu przechowywania niektórych aplikacji w pamięci podręcznej. | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Przycina bufor obrazu wewnętrznego przedniego aparatu. Jeśli zastępowanie jest wyłączone, przycinanie przedniego aparatu jest usuwane, a pole widzenia w podglądzie aparatu staje się większe. Gdy korzystasz z wewnętrznego przedniego aparatu, domyślnie na urządzeniu Pixel Fold system przycina podgląd wszystkich aplikacji aparatu. | |
Inne | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Zapobiega przyciemnieniu aplikacji, gdy nie jest ona już widoczna w trybie podzielonego ekranu. Aplikacja czeka na zaznaczenie przed narysowaniem zawartości, co może spowodować jej zablokowanie lub zaciemnienie. Dzięki temu Android może wysyłać do aplikacji fałszywe zdarzenie skupienia, które informuje ją, że ma wznowić rysowanie treści. |
WYPUŚĆ_APLIKACJĘ
Wymusza możliwość zmiany rozmiaru pakietów, do których zastosowano zastąpienie. Nie ma wpływu na to, czy aplikację można włączyć w tryb wielu okien, ale umożliwia zmianę rozmiaru aplikacji bez włączania trybu zgodności rozmiaru podczas zmiany rozmiaru ekranu.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw atrybut android:resizeableActivity
na wartość prawda lub ustaw flagę metadanych android.supports_size_changes
na wartość prawda (aby obsługiwać zmianę rozmiaru przy jednoczesnym wyłączeniu trybu wielu okien z ustawieniem android:resizeableActivity
ustawionym na fałsz) w manifeście aplikacji.
Optymalizacja aplikacji
Używaj układów elastycznych/adaptacyjnych, aby umożliwić aplikacjom dostosowywanie się do wszystkich rozmiarów wyświetlaczy i formatów obrazu. Zobacz Obsługa różnych rozmiarów ekranu.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
polecenia adb do przetestowania zastąpienia
Aby zastosować zastępowanie i włączyć możliwość zmiany 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
APLIKACJA FORCE_NON_RESIZE_APP
Powoduje, że nie można zmienić rozmiaru pakietów, do których zastosowano zastąpienie, i powoduje przejście w tryb zgodności rozmiaru po zmianie konfiguracji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw zarówno atrybut android:resizeableActivity
, jak i flagę metadanych android.supports_size_changes
na false w manifeście aplikacji i zadeklaruj ograniczenie orientacji lub formatu obrazu.
Optymalizacja aplikacji
W przypadku wszystkich aplikacji, które działają dobrze po zmianie rozmiaru, ustawienie android:resizeableActivity
lub android.supports_size_changes
musi mieć wartość Prawda. Inne aplikacje powinny działać lepiej po zmianie rozmiaru. Patrz android:resizeableActivity.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
polecenia adb do przetestowania zastąpienia
Aby zastosować zastąpienie i nie można zmienić 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO
Kontroler w przypadku wszystkich zabiegów, które wymuszają określony minimalny współczynnik proporcji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw android:minAspectRatio
na poziomie aktywności lub aplikacji.
Optymalizacja aplikacji
Nie należy ustawiać ograniczeń formatu obrazu w aplikacji. Upewnij się, że aplikacja obsługuje różne rozmiary ekranu. Za pomocą klas rozmiaru okna możesz obsługiwać różne układy w zależności od ilości miejsca na ekranie. Więcej informacji znajdziesz w artykułach Compose WindowSizeClass
API i View WindowSizeClass
API.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Określ ograniczenie formatu obrazu lub ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_TYLKO
Ogranicza opcje, które wymuszają określony minimalny format obrazu w przypadku aktywności w orientacji pionowej. Ta opcja jest domyślnie włączona i działa tylko wtedy, gdy włączona jest też zasada OVERRIDE_MIN_ASPECT_RATIO
.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi, które należy dostosować zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania 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 jako zastępowanie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi, które należy dostosować zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania 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 jako zastępowanie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi, które należy dostosować zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO_DO_ALIGN_WITH_SPLIT_SCREEN
Włącza podzielony ekran. Pozwala aplikacji na wykorzystanie całego dostępnego miejsca w trybie podzielonego ekranu, unikając efektu czarnych pasów.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi, które należy dostosować zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
Wyłącza zastąpienie minimalnego współczynnika proporcji na pełnym ekranie w orientacji pionowej, by wykorzystać całe dostępne miejsce na ekranie.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usługi, które należy dostosować zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_UNDEFINED_ORIENTATION_NA_PIONOWEJ
Włącza orientację pionową dla wszystkich aktywności w pakiecie. Jeśli nie włączono OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa innej stałej orientacji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw atrybut activity:screenOrientation
w pliku manifestu lub użyj interfejsu API Activity#setRequestedOrientation
.
Optymalizacja aplikacji
Aplikacja powinna obsługiwać wszystkie orientacje. Zmiana orientacji to zmiana konfiguracji, która może być realizowana na 2 sposoby: przez umożliwienie systemowi zniszczenia i odtworzenie aplikacji lub samodzielne zarządzanie zmianami w konfiguracji. Jeśli samodzielnie zarządzasz zmianami konfiguracji, możesz zachować stan aplikacji za pomocą narzędzia ViewModel
. W bardzo nielicznych przypadkach możesz zablokować orientację tylko na małych ekranach, ale może to nie pozwolić na skalowanie w taki sposób, aby użytkownik mógł obracać aplikację zgodnie z potrzebami. W Androidzie 12L i nowszych stałą orientację można zastąpić przez konfigurację urządzenia. Więcej informacji o obsłudze zmian konfiguracji i obsłudze wszystkich orientacji znajdziesz w artykułach Obsługa zmian konfiguracji, Omówienie modelu ViewModel i Ograniczenie orientacji aplikacji na telefonach, ale nie na urządzeniach z dużym ekranem.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_UNDEFINED_ORIENTATION_NA_NOSENSOR
Włącza orientację nosensor dla wszystkich aktywności w pakiecie. Jeśli nie włączono OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa innej stałej orientacji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw atrybut activity:screenOrientation
w pliku manifestu lub użyj interfejsu API Activity#setRequestedOrientation
.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Umożliwia włączanie orientacji odwrotnej w przypadku wszystkich aktywności w pakiecie. Jeśli nie włączono OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa innej stałej orientacji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw atrybut activity:screenOrientation
w pliku manifestu lub użyj interfejsu API Activity#setRequestedOrientation
.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_ANY_ORIENTATION
Zezwala na zastąpienie dowolnej orientacji OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw atrybut activity:screenOrientation
w pliku manifestu lub użyj interfejsu API Activity#setRequestedOrientation
.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_ORIENTATION_TYLKO_DLA_APARATU
Limity: OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE obowiązują tylko wtedy, gdy połączenie z kamerą jest aktywne.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw atrybut activity:screenOrientation
w pliku manifestu lub użyj interfejsu API Activity#setRequestedOrientation
.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania 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 w trybie pełnoekranowym
- Właściwość komponentu
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
z możliwością rezygnacji nie jest włączona - Ustawienie ignorowania prośby producenta urządzenia o zignorowanie orientacji jest włączone dla wyświetlacza
- Wyświetlacz ma naturalną orientację poziomą.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Nie dotyczy. Zadanie należy rozwiązać w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION (ZGODNOŚĆ_ZOSTAWIEŃ_IGNORE_REQUESTED_ORIENTATION)
Włącza zasadę zgodności, która pomija aktualizowanie orientacji aplikacji w odpowiedzi na wywołanie aplikacji Activity#setRequestedOrientation()
, gdy aplikacja jest ponownie uruchamiana lub ma aktywną funkcję zgodności z kamerą.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
na wartość true.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
Włącza zasadę zgodności, która ignoruje żądaną orientację aplikacji w odpowiedzi na wywołanie Activity#setRequestedOrientation()
więcej niż 2 razy w ciągu sekundy, jeśli w przypadku aktywności nie ma czarnych pasów w ustalonej orientacji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Nie dotyczy. Zadanie należy rozwiązać w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION (ZASTĄPANIE_żądania_REKLAM)
Nie uwzględnia pakietów ignorowania żądań orientacji, które producenci mogą włączyć na obszarze wyświetlania lub na całym ekranie.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Nie dotyczy. Zadanie należy rozwiązać w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Bez możliwości rezygnacji. Wyłączenie zastępowania może być niebezpieczne, jeśli aplikacja jest niezgodna z urządzeniem, na którym producent urządzenia ma włączone ustawienie ignorowania żądań orientacji. Aby wyłączyć zastępowanie, skontaktuj się z zespołem ds. relacji z deweloperami Androida.
Flagi usługi, które należy dostosować zastąpienie
Brak flag właściwości dla tego zastąpienia.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
NEVER_SANDBOX_DISPLAY_APIS
Wymusza, aby do aktywności w trybie zgodności z czarnymi pasami lub w trybie zgodności rozmiaru nie była stosowana piaskownica interfejsu API Display
. Interfejsy API Display
nadal zapewniają granice obszaru wyświetlania
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Zadeklaruj działania, których rozmiar można zmieniać, ustawiając wartość atrybutu manifestu android:resizeableActivity
na wartość true lub flagę metadanych android.supports_size_changes
na wartość true.
Optymalizacja aplikacji
Aplikacje, w przypadku których zadeklarowano, że mają możliwość zmiany rozmiaru, nie powinny nigdy ustalać pozycji elementów interfejsu na podstawie rozmiaru interfejsu. Przejdź na aktualne interfejsy API, które udostępniają WindowMetrics
. Jeśli używasz Jetpack Compose, wykorzystaj interfejs API WindowSizeClass
, aby narysować interfejs w zależności od tego, jaki obszar ekranu ma aplikacja na bieżącym wyświetlaczu. Zobacz Obsługa różnych rozmiarów ekranu.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Bez możliwości rezygnacji. Migracja z wycofanych interfejsów API
Flagi usługi, które należy dostosować zastąpienie
Brak flag właściwości dla tego zastąpienia.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
ALWAYS_SANDBOX_DISPLAY_APIS
Wymusza, aby pakiety zawsze miały zastosowane piaskownica interfejsu API Display
niezależnie od trybu okna. Interfejsy API Display
zawsze określają granice aplikacji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Zadeklaruj działania, których nie można zmienić, ustawiając wartość atrybutu android:resizeableActivity
na fałsz lub wartość flagi metadanych android.supports_size_changes
na wartość fałsz.
Optymalizacja aplikacji
Aplikacje, w przypadku których zadeklarowano, że mają możliwość zmiany rozmiaru, nie powinny nigdy ustalać pozycji elementów interfejsu na podstawie rozmiaru interfejsu. Przenieś swoją aplikację z wycofanych interfejsów API z aktualnych interfejsów API, które udostępniają WindowMetrics
. Zobacz WindowMetricsCalculator
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Bez możliwości rezygnacji. Migracja z wycofanych interfejsów API
Flagi usługi, które należy dostosować zastąpienie
Brak flag właściwości dla tego zastąpienia.
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
Wymusza, aby pakiety znalazły się w piaskownicy między tymi interfejsami API View
w granicach aktywności:
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Rozwiąż problem w kodzie aplikacji, używając interfejsów API, które określają granice okna aplikacji i przesunięć względem okna aplikacji, a nie granic wyświetlacza i przesunięć urządzenia względem wyświetlacza urządzenia.
Optymalizacja aplikacji
Aplikacje powinny używać interfejsów API View
, biorąc pod uwagę możliwość zastosowania w niej funkcji letterbox i trybu wielu okien. Patrz WindowMetricsCalculator
.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Wyłącza wymuszanie rotacji. Poprawia komfort korzystania z niektórych aplikacji.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
na false (fałsz).
Optymalizacja aplikacji
Nie polegaj na orientacji czujnika aparatu w pamięci podręcznej ani informacji o urządzeniu. Wskazówki dotyczące zgodności aparatu znajdziesz w artykułach Wprowadzenie do wizjera aparatu i artykuł Obsługa powierzchni, których rozmiar można zmieniać w aplikacji aparatu.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
na wartość true.
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
polecenia adb do przetestowania zastąpienia
Aby zastosować zastąpienie i usunąć wymuszoną obrót:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Aby usunąć zastąpienie, co umożliwia wymuszenie rotacji:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Uwaga: te polecenia służą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_CAMERA_COMPAT_DISABLE_ODŚWIEŻ
Wyłącza odświeżanie aktywności po wymuszeniu rotacji. Poprawia komfort korzystania z aplikacji, gdy odświeżanie powoduje utratę stanu.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
na false (fałsz).
Optymalizacja aplikacji
Nie polegaj na orientacji czujnika aparatu w pamięci podręcznej ani informacji o urządzeniu. Wskazówki dotyczące zgodności aparatu znajdziesz w artykułach Wprowadzenie do wizjera aparatu i artykuł Obsługa powierzchni, których rozmiar można zmieniać w aplikacji aparatu.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
na wartość true.
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
polecenia adb do przetestowania zastąpienia
Aby zastosować zastąpienie, które spowoduje usunięcie odświeżania aktywności:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Aby usunąć zastąpienie, co umożliwia odświeżanie aktywności:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Uwaga: te polecenia służą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_CAMERA_COMPAT_ENABLE_ODŚWIEŻ_WSTRZYMANIE_PAUZA
Sprawia, że pakiety, które są używane do odświeżania aktywności, za pomocą funkcji onResume()
→ onPause()
→ cykl onResume()
, a nie onResume()
→ onStop()
→ onResume()
po wymuszeniu rotacji zgodnie z kamerą.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
na wartość true.
Optymalizacja aplikacji
Nie polegaj na orientacji czujnika aparatu w pamięci podręcznej ani informacji o urządzeniu. Wskazówki dotyczące zgodności aparatu znajdziesz w artykułach Wprowadzenie do wizjera aparatu i artykuł Obsługa powierzchni, których rozmiar można zmieniać w aplikacji aparatu.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_CAMERA_LANDSCAPE_NA_PIONOWEJ
Wymusza przycięcie obrazu wyjściowego kamery do odwrotnej orientacji, gdy pionowa orientacja aparatu nie odpowiada naturalnej orientacji urządzenia. Wiele aplikacji nie radzi sobie z tą sytuacją i w innym przypadku wyświetla rozciągnięte obrazy.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
na wartość true.
Optymalizacja aplikacji
Nie polegaj na orientacji czujnika aparatu w pamięci podręcznej ani informacji o urządzeniu. Wskazówki dotyczące zgodności aparatu znajdziesz w artykułach Wprowadzenie do wizjera aparatu i artykuł Obsługa powierzchni, których rozmiar można zmieniać w aplikacji aparatu.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
polecenia adb do przetestowania zastąpienia
Aby zastosować zastąpienie i przyciąć przedni aparat:
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Aby usunąć zastąpienie i usunąć przycięcie przedniego aparatu:
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Uwaga: te polecenia służą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
Uniemożliwia aplikacjom rezygnację z udostępniania ekranu (patrz Wyświetlanie multimediów).
Stosowane, gdy aplikacje niewłaściwie korzystają z interfejsu API createConfigForDefaultDisplay()
, aby wymuszać robienie zrzutów ekranu na pełnym ekranie i narażając prywatność użytkowników, ujawniając zawartość powiadomień, które są rejestrowane w trybie pełnoekranowym, ale nie w ramach udostępniania ekranu aplikacji. Dotyczy to też wszystkich aplikacji niezależnie od trybu okna.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Zezwalaj na domyślne zachowanie projekcji multimediów (zaimplementowane w Androidzie 14, poziom API 34 i createScreenCaptureIntent()
), dzięki czemu użytkownicy mogą decydować, czy udostępniać cały ekran czy pojedyncze okno aplikacji bez względu na tryb okna. Możesz też wywołać funkcję createScreenCaptureIntent(MediaProjectionConfig)
z argumentem MediaProjectionConfig
zwróconym z wywołania do createConfigForUserChoice()
.
Optymalizacja aplikacji
Zezwalaj użytkownikom na włączanie i wyłączanie podczas wyświetlania multimediów całego ekranu urządzenia czy okna aplikacji – od Androida 14 jest to zachowanie domyślne.
Włącz możliwość zmiany rozmiaru aplikacji (resizeableActivity="true"
), aby działała w trybie wielu okien.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ze względu na wagę prywatności użytkownika aplikacja nie może wyłączyć tego zastąpienia ani z niego zrezygnować.
Flagi usługi, które należy dostosować zastąpienie
Brak.
polecenia adb do przetestowania zastąpienia
Aby zastosować zastępowanie, co spowoduje anulowanie rezygnacji aplikacji z udostępniania części ekranu (czyli udostępnianie części ekranu):
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Aby usunąć zastąpienie i umożliwić aplikacji zrezygnowanie z udostępniania części ekranu:
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Uwaga: te polecenia służą tylko do tymczasowego stosowania lub usuwania zastąpienia.
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
Umożliwia wysyłanie fałszywego zaznaczenia z aplikacji w trybie podzielonego ekranu. Niektóre silniki gier oczekują, że aplikacja zostanie zaznaczona, zanim zacznie rysować zawartość aplikacji. Dlatego fałszywy tryb fokusa pomaga uniknąć czarnego zaznaczenia po wznowieniu działania aplikacji i nie jest na niej jeszcze ustawiona ostrość.
Jak aplikacje mogą osiągnąć taki sam efekt jako zastępowanie
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na wartość true.
Optymalizacja aplikacji
Możesz uniknąć tego problemu, jeśli Twoja aplikacja dobrze obsługuje różne orientacje i zmiany konfiguracji. Dostosuj aplikację do dużego ekranu, postępując zgodnie ze wskazówkami dotyczącymi jakości aplikacji na duży ekran.
Jeśli używasz silnika gry Unity, uaktualnij go do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. Pozostaw zaznaczoną opcję Resizable Window
w ustawieniach Android Playera.
Jak wyłączyć zastępowanie lub z niego zrezygnować
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na false (fałsz).
Flagi usługi, które należy dostosować zastąpienie
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
polecenia adb do przetestowania 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łużą tylko do tymczasowego stosowania lub usuwania zastąpienia.
Dodatkowe materiały
- Wskazówki dotyczące jakości aplikacji na duży ekran
- Podstawowe wskazówki dotyczące jakości aplikacji