Android aktywuje tryb zgodności w przypadku aplikacji, które deklarują ograniczenia dotyczące orientacji lub możliwości zmiany rozmiaru. Tryb zgodności zapewnia dopuszczalne działanie aplikacji na urządzeniach z dużym ekranem i składanych telefonach z klapką, ale nie jest w pełni optymalna.
Zastąpienia według aplikacji umożliwiają producentom urządzeń zmianę zachowania aplikacji, aby zwiększyć wygodę użytkowników lub zapobiec awariom aplikacji na określonych urządzeniach.
Urządzenia referencyjne
Ze względu na nietypowe konfiguracje lub konfiguracje, które nie są dobrze obsługiwane przez aplikacje, te urządzenia mogą wymagać zastąpień w zależności od aplikacji:
- Tablety: domyślna orientacja niektórych tabletów, takich jak Pixel Tablet, to orientacja pozioma. Urządzenie jest w naturalnej orientacji, gdy
Display#getRotation()
powraca doSurface.ROTATION_0
. Jeśli aplikacje zakładają, żeROTATION_0
to orientacja pionowa, układy aplikacji i podgląd aparatu mogą nie pasować do ekranu urządzenia. - Urządzenia składane poziome: niektóre urządzenia składane, takie jak Pixel Fold, mają po złożeniu pionową orientację, a po rozłożeniu – orientację poziomą. Jeśli aplikacje zakładają, że rozłożony ekran ma orientację pionową, mogą wystąpić problemy z migotaniem lub pętlami.
- Składane telefony: rozłożone telefony są zwykle w orientacji pionowej. Jednak po złożeniu telefony zwykle mają mały wyświetlacz w orientacji poziomej. Aplikacje muszą określać i uwzględniać różne orientacje wyświetlaczy.
Typowe problemy ze zgodnością
Problemy ze zgodnością występują najczęściej z powodu ograniczeń orientacji aplikacji, zmiany rozmiaru i współczynnika proporcji obrazu, nieprawidłowej obsługi orientacji podglądu z aparatu oraz niewłaściwie używanych interfejsów API.
Letterboxing
W trybie Letterbox aplikacja jest umieszczona na środku ekranu lub, w przypadku dużych ekranów, po jednej lub drugiej stronie, aby zapewnić wygodny dostęp. Maty (paski w jednolitym kolorze lub rozmyte tapety) wypełniają nieużywany obszar wyświetlacza wzdłuż boków oraz górnej i dolnej części aplikacji.
Letterboxowanie często występuje na urządzeniach z dużym ekranem, ponieważ wymiary i format obrazu na wyświetlaczu są zwykle inne niż w przypadku standardowych telefonów, na które przeznaczona jest większość aplikacji.
Problem
Aplikacja nie obsługuje wszystkich konfiguracji wyświetlania, ponieważ ma stałą orientację, stały współczynnik proporcji lub nie można jej skalować.
Ustawienia konfiguracji, które kontrolują orientację i zmianę rozmiaru aplikacji, obejmują te elementy:
screenOrientation
: określa stałą orientację aplikacji. Aplikacje mogą też ustawiać orientację w czasie działania za pomocą elementuActivity#setRequestedOrientation()
.resizeableActivity
: wskazuje, czy system może zmieniać rozmiary aplikacji, aby pasowały do okien o różnych wymiarach. W Androidzie 11 (poziom interfejsu API 30) lub starszym określa, czy aplikacje obsługują tryb wielookienkowy. W przypadku Androida 12 (poziom API 31) lub nowszego określa, czy aplikacje obsługują tryb wielookienkowy na małych ekranach (klasa rozmiaru okna). Na Androidzie 12 i nowszych aplikacje obsługują tryb wielu okien na dużych ekranach (klasa średniego lub rozwiniętego rozmiaru okna) niezależnie od tego ustawienia.maxAspectRatio
: określa maksymalny współczynnik proporcji obsługiwany przez aplikację. UstawieniemaxAspectRatio
mogą zmienić tylko aplikacje, w których parametrzeresizeableActivity
jest ustawiona wartośćfalse
.minAspectRatio
: określa minimalny współczynnik proporcji obsługiwany przez aplikację.minAspectRatio
można ustawiać tylko w aplikacjach, w których parametrresizeableActivity
ma wartośćfalse
.
Optymalizacja
Aplikacja powinna obsługiwać wszystkie orientacje i rozmiary wyświetlacza oraz tryb wielookienności. Usuń z układów aplikacji i pliku manifestu aplikacji wszystkie ograniczenia orientacji i stałego formatu obrazu.
Obejście dotyczące zgodności
Jeśli aplikacja o stałej orientacji lub współczynniku proporcji nie działa w oknie, które nie obsługuje bezpośrednio rozmiaru lub orientacji okna, w Androidzie pojawią się czarne paski, aby zachować ciągłość.
Począwszy od Androida 12 (poziom API 31) i później 12L (poziom API 32), platforma wprowadza różne ulepszenia w aplikacji w formacie letterbox. Producenci urządzeń wdrażają ulepszenia interfejsu. Aby skorzystać z tych ulepszeń, nie musisz wprowadzać żadnych dodatkowych zmian w aplikacji.
Android 12 (poziom interfejsu API 31) wprowadza te ulepszenia estetyczne, które mogą być konfigurowane przez producentów urządzeń:
- Zaokrąglone rogi: rogi okna aplikacji mają bardziej wyrafinowany wygląd.
- Przezroczystość paska systemu: paski stanu i paski nawigacyjne, które nakładają się na aplikację, są półprzezroczyste, dzięki czemu ikony na paskach są zawsze widoczne na tle okienka.
- Format obrazu: format obrazu aplikacji można dostosować, aby poprawić jej wygląd.
12L (poziom interfejsu API 32) zawiera te ulepszenia funkcjonalności:
Konfigurowalne pozycjonowanie: na dużych ekranach producenci urządzeń mogą umieszczać aplikację po lewej lub prawej stronie wyświetlacza, co ułatwia interakcję.
Zmieniony przycisk ponownego uruchamiania: producenci urządzeń mogą zmienić wygląd przycisku ponownego uruchamiania w trybie zgodności z rozmiarem, aby ułatwić użytkownikom jego rozpoznawanie.
Android 13 (poziom interfejsu API 33) dodaje okno z informacjami dla użytkowników o umieszczaniu aplikacji z czarnymi pasami na ekranie oraz w trybie podzielonego ekranu:
Tryb zgodności rozmiaru
Tryb zgodności rozmiaru to czarne pasy z elementem sterującym restartowaniem. Ten element sterujący umożliwia użytkownikom ponowne uruchomienie aplikacji i odświeżenie wyświetlacza. Android wywołuje tryb zgodności z rozmiarem w przypadku aplikacji, które nie mogą być zmieniane. Gdy aktywność zostanie przeniesiona do kontenera wyświetlania, który jest niezgodny z jej wymiarami, system może zmienić jej rozmiar, aby wypełnić co najmniej 1 wymiar ekranu urządzenia.
Zmiany konfiguracji urządzenia, które mogą spowodować przejście w tryb zgodności z rozmiarem:
- Obracanie urządzenia
- Składanie i rozkładanie składanego urządzenia
- Przełączanie się między trybami wyświetlania pełnego ekranu i podzielonego ekranu
Problem
Tryb zgodności rozmiaru ma zwykle zastosowanie do działań o ograniczonej orientacji lub współczynniku proporcji, które zostały skonfigurowane (lub określone przez system) tak, aby nie można było zmieniać ich rozmiaru.
Aplikacja jest uznawana za umożliwiającą zmianę rozmiaru i nie jest umieszczana w trybie zgodności z rozmiarem, jeśli spełnia co najmniej 1 z tych kryteriów:
- można zmienić rozmiar za pomocą
resizeableActivity="true"
, - Obsługuje tryb obraz w obrazie (PIP).
- jest osadzony;
- czy producent urządzenia zastosował zastąpienie dla aplikacji
FORCE_RESIZE_APP
(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 wyświetlania. Aby umożliwić zmianę rozmiaru aplikacji, w pliku manifestu aplikacji ustaw atrybut android:resizeableActivity
elementu <activity>
lub <application>
na true
. Zaprojektuj układy elastyczne lub adaptacyjne dla swojej aplikacji. Więcej informacji znajdziesz w artykułach Obsługa różnych rozmiarów ekranu i Obsługa trybu wielookiennego.
Obejście zgodności
Android włącza tryb zgodności rozmiaru, gdy system stwierdzi, że wyświetlanie aplikacji z czarnymi pasami można poprawić, przeskalując aplikację tak, aby wypełniła okno wyświetlania w co najmniej 1 wymiarze. System wyświetla opcję ponownego uruchamiania, która ponownie tworzy proces aplikacji, odtwarza aktywność i ponownie rysuje wyświetlacz. Zobacz też Omówienie procesów i wątków.
migające pętle,
Jeśli aplikacja nie obsługuje wszystkich orientacji ekranu, może wielokrotnie prosić o nowe orientacje po zmianie konfiguracji, tworząc nieskończony cykl, który powoduje migotanie ekranu lub niekończące się obracanie aplikacji.
Problem
W Androidzie 12 (API na poziomie 31) i nowszych producenci urządzeń mogą skonfigurować swoje urządzenia tak, aby ignorowały ograniczenia orientacji określone przez aplikacje, a zamiast tego stosowały tryby zgodności. Na przykład urządzenie składane może zignorować ustawienie android:screenOrientation="portrait"
aktywności, gdy jest ona wyświetlana na wewnętrznym ekranie w urządzeniu dotykowym w orientacji poziomej.
Jeśli ograniczenia dotyczące orientacji aplikacji zostaną zignorowane, aplikacja może automatycznie ustawić swoją orientację, wywołując metodę Activity#setRequestedOrientation()
. Jeśli aplikacja nie obsługuje zmian konfiguracji (patrz Obsługa zmian konfiguracji), wywołanie powoduje jej ponowne uruchomienie. Po ponownym uruchomieniu ograniczenia dotyczące orientacji aplikacji są ponownie ignorowane, aplikacja powtarza wywołanie funkcji setRequestedOrientation()
, a następnie powoduje to ponowne uruchomienie aplikacji itd. w pętli samotrwałej.
Może się to też zdarzyć, gdy naturalna orientacja (czyli zwykła, jak określa ją Android) ekranu urządzenia jest pozioma (czyli wywołanieDisplay#getRotation()
zwracaSurface.ROTATION_0
, gdy urządzenie ma format obrazu poziomego). Do tej pory aplikacje zakładały, że Display.getRotation() =
Surface.ROTATION_0
oznacza, że urządzenie jest w orientacji pionowej, ale nie zawsze tak jest, na przykład na wewnętrznym ekranie niektórych składanych urządzeń i na niektórych tabletach.
Aplikacja w orientacji poziomej na składanym ekranie wewnętrznym może sprawdzić obrót ekranu, otrzymać wartość ROTATION_0
, przyjąć, że naturalną orientacją urządzenia jest orientacja pionowa, i wywołać funkcję setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
, aby zmienić układ aplikacji. Po ponownym uruchomieniu aplikacji (w orientacji poziomej) aplikacja może ponownie sprawdzić obrót ekranu, otrzymać wartość ROTATION_0
, wywołać setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT)
i kontynuować pętlę nieskończoną.
Optymalizacja
Aplikacje nie mogą:
- Ustaw domyślny kierunek za pomocą
Activity#setRequestedOrientation()
w metodzie activityonCreate()
, ponieważ żądanie dotyczące orientacji może zostać nieoczekiwanie wywołane przez nieobsługiwane zmiany konfiguracji. - Zakładamy, że naturalna orientacja urządzenia (
ROTATION_0
) to orientacja pionowa - Ustaw orientację na podstawie sygnałów niezwiązanych z obecnym rozmiarem okna, takich jak
Display#getRotation()
, obecnośćFoldingFeature
lub wycofane interfejsy API.
Obejście zgodności
Android ignoruje wywołania Activity#setRequestedOrientation()
w tych sytuacjach:
Aktywność została już wznowiona po wcześniejszym wywołaniu tej metody lub zostało włączone przetwarzanie siły zgodnej z aparatem (patrz Podgląd aparatu poniżej).
Producenci urządzeń mogą zastosować to zachowanie w aplikacji za pomocą funkcji
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
.Aktywność wysłała w ciągu 1 sekundy więcej niż 2 żądania orientacji, co wskazuje na wystąpienie pętli. Z 2 żądań w pętli Android używa tego, który maksymalizuje obszar wyświetlania aplikacji.
Producenci urządzeń mogą zastosować to zachowanie w aplikacji za pomocą funkcji
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
.
Podgląd z aparatu
Na tabletach, laptopach i składanych wyświetlaczach podgląd aparatu w aplikacjach aparatu (lub wizjer) może być niewłaściwie ułożony lub zniekształcony.
Problem
W dokumencie definicji zgodności z Androidem stwierdza się, że czujnik obrazu w aparacie „MUSI być zorientowany tak, by długi wymiar aparatu był zgodny z długością ekranu”.
Aplikacje często zakładają, że orientacja urządzenia i czujnika aparatu jest pionowa – jest to rozsądne założenie w przypadku standardowych telefonów komórkowych. Jednak naturalna orientacja tabletów i laptopów oraz ich czujników aparatu może być pozioma. Nowe formaty, takie jak składane urządzenia, mogą mieć wiele naturalnych orientacji i wiele czujników aparatu w różnych orientacjach.
Rozpoczynanie aktywności z orientacją aparatu, której aplikacja nie obsługuje, lub przełączanie się między różnymi kamerami lub ekranami urządzenia (w przypadku składanych urządzeń) może spowodować przesunięcie lub zniekształcenie podglądu aparatu.
Optymalizacja
Aby wyświetlać poprawnie wyrównany i przeskalowany podgląd z aparatu, aplikacje aparatu muszą prawidłowo rozpoznawać orientację urządzenia i orientację czujnika aparatu oraz nimi zarządzać. Aplikacje muszą obliczyć obrót urządzenia, obrót czujnika oraz proporcje ekranu lub okna, a następnie zastosować wyniki do podglądu z aparatu. Szczegółowe wskazówki znajdziesz w artykułach Podgląd aparatu i Przedstawiamy wizjer aparatu.
Obejście zgodności
Urządzenie jest w naturalnej orientacji, gdy Display#getRotation()
zwraca Surface.ROTATION_0
. System oblicza wartość CameraCharacteristics.SENSOR_ORIENTATION
na podstawie naturalnej orientacji urządzenia. Android dopasowuje okno pionowe aplikacji z ograniczeniem pionowym do naturalnej orientacji urządzenia – tego oczekuje większość aplikacji. Android przycina też obraz z czujnika aparatu, gdy orientacja czujnika jest pozioma, a podgląd aparatu – pionowa. Konkretne sposoby obejścia tego problemu to m.in.:
Wymuszanie obracania podglądów aparatu w przypadku aplikacji ograniczonych do orientacji pionowej: aplikacje ograniczone do orientacji pionowej oczekują, że naturalna orientacja urządzenia i orientacja czujnika aparatu będą pionowe. Jednak w Androidzie 12 (poziom interfejsu API 31) i nowszych aplikacje mogą działać w różnych orientacjach urządzeń, jeśli producenci zignorują specyfikację orientacji.
Gdy aplikacja z ograniczeniami dotyczącymi orientacji pionowej jest połączona z aparatem, Android wymusza jej obrócenie, aby dopasować okno aplikacji do naturalnej orientacji urządzenia.
Na niektórych tabletach (patrz urządzenia referencyjne) okno aplikacji w orientacji pionowej jest obrócone do pełnego ekranu, aby dostosować je do naturalnej orientacji urządzenia. Po użyciu siły obrót aplikacja zajmuje pełny ekran.
Na wewnętrznym ekranie w orientacji poziomej składanych urządzeń (patrz urządzenia referencyjne) aktywności przeznaczone tylko do trybu pionowego są obracane w poziom, aby dopasować je do naturalnej orientacji po rozłożeniu. Po wymuszeniu rotacji aplikacja ma czarne pasy.
Przycinanie wewnętrznego aparatu przedniego: w przypadku niektórych składanych urządzeń czujnik wewnętrznego aparatu przedniego jest w orientacji poziomej. Oprócz wymuszania obracania podglądu aparatu na składanym wewnętrznym ekranie Android przycina pole widzenia wewnętrznego przedniego (poziomego) aparatu, tak aby czujnik rejestruje obraz przeciwny od orientacji urządzenia.
Wymuś odświeżenie podglądów z kamery: system przełącza się między metodami aktywności
onStop()
ionStart()
(domyślnie) lubonPause()
ionResume()
(zastosowanymi przez zastąpienie na poziomie aplikacji OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE) po wymuszeniu, by podgląd z kamery wyświetlał się prawidłowo.Skalowanie formatu obrazu: system dynamicznie zmienia format obrazu podglądu wymuszonego obrotu kamery na większy format obrazu, co zapewnia prawidłowe skalowanie podglądu.
Deweloperzy aplikacji mogą zignorować te obejścia, jeśli ich aplikacje obsługują podgląd aparatu. Zobacz zastąpienia na poziomie aplikacji.
Interfejsy API, których użytkownicy często nadużywają
Android obsługuje teraz takie funkcje jak tryb wielozadaniowości i urządzenia składane, dlatego starsze interfejsy API zostały wycofane i zastąpione nowszymi, które działają na wszystkich rozmiarach ekranów i w przypadku wszystkich form czynników urządzeń. Jednak wycofane interfejsy API są nadal dostępne na potrzeby zgodności wstecznej.
Niektóre interfejsy API View
są przeznaczone do specjalnych celów, które nie zawsze są dobrze rozumiane przez deweloperów.
Problem
Deweloperzy nadal używają wycofanych interfejsów API Display
i nieprawidłowo zakładają, że interfejsy API zwracają granice aplikacji zamiast granic obszaru wyświetlania urządzenia. Może też być tak, że deweloperzy używają interfejsów API widoku do celów specjalnych, aby uzyskać ogólne dane wyświetlania.
W efekcie po zmianie rozmiaru okna aplikacji dochodzi do błędów w przemieszczaniu elementów interfejsu, co powoduje problemy z układem.
Wycofane i często niewłaściwie używane interfejsy Display API:
Więcej informacji znajdziesz w artykule Obsługa trybu wielookiennego.
Niewłaściwe użycie interfejsów API wyświetlania:
Optymalizacja
Nigdy nie licz na to, że rozmiar fizycznego wyświetlacza wystarczy do pozycjonowania elementów interfejsu. Przeprowadź migrację aplikacji na interfejsy API oparte na WindowMetrics
, w tym na te interfejsy WindowManager
:
Platforma:
Jetpack:
obejście problemu dotyczącego zgodności,
2 zastąpienia dostosowują wycofane interfejsy API Display
i niewłaściwie używane interfejsy API View
, aby zwracać granice aplikacji:
ALWAYS_SANDBOX_DISPLAY_APIS
dla interfejsów API Display
;
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
dla interfejsów API View
. Ustawienie ALWAYS_SANDBOX_DISPLAY_APIS
jest też domyślnie stosowane do aplikacji, które kwalifikują się do trybu zgodności rozmiaru.
przejrzyste działania,
Aktywności przezroczyste są wynikiem stosowania przezroczystych stylów tła, np.:
<style name="Transparent" parent="AppTheme">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowBackground">@android:color/transparent</item>
</style>
Tematy związane z dialogami, takie jak Theme.MaterialComponents.Dialog
, mogą zawierać style, które czynią działania przejrzystymi.
Działania przezroczyste nie obejmują całej dostępnej przestrzeni wyświetlania, co utrudnia zarządzanie nimi, ponieważ dostępny obszar wyświetlania może się zmieniać zależnie od zmian w konfiguracji, takich jak obrót urządzenia, składanie i rozkładanie urządzenia czy tryb wielu okien.
Problem
Przeźroczysta aktywność powinna być zgodna z granicami pierwszej nieprzezroczystej aktywności poniżej niej w stosie działań zadania. Jednak nieprzejrzysta aktywność, która uruchamia okno z prośbą o przyzwolenie, może być trampolinem (czyli aktywnością, która uruchamia inną aktywność, a potem znika). W takim przypadku system nie może określić granic aktywności trampoline, która uruchomiła przejrzystą aktywność z prośbą o przyzwolenie.
Optymalizacja
Aktywności przejrzyste dziedziczą ograniczenia od najbardziej nieprzezroczystej aktywności znajdującej się poniżej nich w zestawie aktywności zadania. Aktywność nieprzezroczysta musi być dostępna przez cały cykl życia aktywności przejrzystej, od jej utworzenia do usunięcia. Z tego powodu nie wysyłaj próśb o udzielenie uprawnień z aktywności na trampolinie.
Jeśli aktywność na trampolinie uruchomi prośbę o przyznanie uprawnień, użytkownik może nie zobaczyć okna uprawnień, ponieważ została ona zniszczona, zanim zdążył zareagować na to okno, a wymiary i pozycja działania okna mogły zostać nieprawidłowo obliczone.
Aplikacje powinny zawsze wysyłać prośby o uprawnienia z działań, które pozostają widoczne, dopóki użytkownik nie podejmie decyzji.
Zaokrąglone rogi
Aktywność może być przezroczysta, ponieważ styl określa przezroczystość tła lub dlatego, że zawartość aktywności nie wypełnia dostępnej przestrzeni wyświetlania. Jeśli przezroczysta aktywność wypełnia dostępną przestrzeń na ekranie, system automatycznie zaokrągla rogi tej aktywności, jeśli producent urządzenia skonfigurował ją w ten sposób. Jeśli jednak działanie przezroczyste (np. okno zezwoleń) nie wypełni dostępnego miejsca, Ty decydujesz, czy zastosować zaokrąglone narożniki.
Dialogi z prośbą o uprawnienia nie wypełniają dostępnej przestrzeni wyświetlania, ponieważ ich układ zwykle używa LayoutParams.WRAP_CONTENT zamiast LayoutParams.MATCH_PARENT.
Obejście zgodności
Zachowaj działania, które uruchamiają działania w oknie, dopóki użytkownik nie odpowie na to okno.
System dba o to, aby aktywność przezroczysta dziedziczyła wszystkie ograniczenia z pierwszej nieprzezroczystej aktywności w stosie aktywności przezroczystej, w tym:
- Tryb zgodności rozmiaru
- Orientacja
- Format obrazu
Gry w Unity
Gry Unity działają na Androidzie na pełnym ekranie lub w trybie wielu okien. Wiele gier na Unity traci jednak ostrość i przestaje rysować po przejściu aplikacji w tryb wielu okien.
Problem
W wersji Unity 2019.4 dodano opcję Resizable Window
, aby umożliwić korzystanie z trybu wielookiennego na Androidzie. Jednak wstępna implementacja nie zareagowała prawidłowo na cykl życia aktywności w trybie wielu okien, przez co UnityPlayer zawieszał odtwarzanie, gdy aplikacja nie jest aktywna. Gracz renderuje czarny ekran lub ostatnią zamrożoną klatkę gry. Rozgrywka została wznowiona
dopiero po dotknięciu ekranu. Wiele aplikacji korzystających z Unity Engine napotyka ten problem i wyświetla się jako czarne okno w trybie wielu okien.
Optymalizacja
Uaktualnij Unity do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. Pozostaw zaznaczoną opcję Resizable Window
w ustawieniach odtwarzacza Androida, w przeciwnym razie gra zostanie wstrzymana, gdy nie będzie aktywna, mimo że będzie w pełni widoczna w trybie wielookiennym.
obejście problemu dotyczącego zgodności,
Producenci urządzeń mogą stosować zastąpienie OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
na poziomie aplikacji, aby zapewnić fałszywe zdarzenie focus w aplikacji w trybie wielozadaniowym. Zastąpienie pozwala aktywności na ponowne przekreślenie treści
bez jej zamazania.
Testowanie aplikacji pod kątem problemów ze zgodnością
Aby przetestować aplikację i dowiedzieć się, jak działa na różnych formatach, skorzystaj z tych materiałów:
- Strumieniowanie 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 Strumieniowanie danych z urządzeń z Androidem z użyciem 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 zachowanie aplikacji. Na przykład zastąpienie FORCE_RESIZE_APP
instruuje system, aby pominął tryb zgodności rozmiaru i zmienił rozmiar aplikacji, aby dopasować ją do wymiarów wyświetlanych, nawet jeśli w manifeście aplikacji określono resizeableActivity="false"
.
Producenci urządzeń stosują zastąpienia w przypadku wybranych lub wszystkich aplikacji na określonych urządzeniach z dużym ekranem. W Androidzie 14 (poziom interfejsu API 34) i nowszych użytkownicy mogą stosować zastąpienia w aplikacjach za pomocą ustawień urządzenia.
Zastąpienia użytkownika w przypadku poszczególnych aplikacji
W Androidzie 14 i nowszych użytkownicy mogą zmieniać format obrazu aplikacji w menu ustawień. Menu są stosowane na dużych ekranach, np. na urządzeniach referencyjnych.
Menu zawiera listę wszystkich aplikacji zainstalowanych na urządzeniu. Użytkownicy wybierają aplikację, a następnie ustawiają jej proporcje na 3:4, 1:1, pełny ekran lub inną wartość skonfigurowaną przez producenta urządzenia. Użytkownicy mogą też zresetować format obrazu do domyślnego, który jest określony w pliku manifestu aplikacji.
Aplikacje mogą zrezygnować z zastąpienia zgodności, ustawiając te tagi PackageManager.Property
:
PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE
Aby zrezygnować z zastępowania zgodności formatu obrazu użytkownika, dodaj właściwość do pliku manifestu aplikacji i ustaw jej wartość na
false
:<application> <property android:name="android.window. PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE" android:value="false" /> </application>
Aplikacja zostanie wykluczona z listy aplikacji w ustawieniach urządzenia. Użytkownicy nie będą mogli zmienić formatu obrazu aplikacji.
Ustawienie tej właściwości na
true
nie ma żadnego wpływu.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
Aby zrezygnować z opcji pełnoekranowego formatu obrazu w ramach zastąpienia zgodności z formatem obrazu użytkownika, dodaj właściwość do pliku manifestu aplikacji i ustaw jej wartość na
false
:<application> <property android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE" android:value="false" /> </application>
Opcja pełnego ekranu zostanie usunięta z listy opcji formatu obrazu w ustawieniach urządzenia. Użytkownicy nie będą mogli zastosować zastąpienia pełnoekranowego w Twojej aplikacji.
Ustawienie tej właściwości na
true
nie ma żadnego efektu.
Zoptymalizuj aplikację pod kątem wszystkich ekranów: nie ustawiaj ograniczeń formatów obrazu w aplikacji. Używaj klas rozmiaru okna, aby obsługiwać różne układy w zależności od ilości dostępnego miejsca.
Zastąpienia producenta urządzenia według aplikacji
Producenci urządzeń stosują zastąpienia na poziomie aplikacji na wybranych urządzeniach. Urządzenia referencyjne mogą domyślnie stosować niektóre zastąpienia do różnych aplikacji.
Aplikacje mogą zrezygnować z większości zastąpień (patrz tabela Zastąpienia na poziomie aplikacji poniżej).
Za pomocą platformy zgodności możesz przetestować aplikację z włączonymi lub wyłączonymi zastąpieniami (patrz Narzędzia platformy zgodności). Gdy ta opcja jest włączona, zastąpienia mają zastosowanie do całej aplikacji.
Możesz też użyć Android Debug Bridge (adb), aby włączyć lub wyłączyć zastąpienia i określić, które zastąpienia mają zastosowanie do Twojej aplikacji.
Włącz lub wyłącz zastąpienia w ten sposób:
adb shell am compat enable/disable <override name/id> <package>
W przypadku urządzeń referencyjnych sprawdź, które zastąpienia mają zastosowanie do Twojej aplikacji:
adb shell dumpsys platform_compat | grep <package name>
Tabela poniżej zawiera listę dostępnych zastąpień oraz wskazówki, jak zoptymalizować aplikację, aby nie musiała ona korzystać z zastąpień. Możesz dodać do pliku manifestu aplikacji flagi właściwości, aby zrezygnować z niektórych override’ów.
Zastąpienia na poziomie aplikacji | |||
---|---|---|---|
Typ | Nazwa | ID | Opis |
Możliwość zmiany rozmiaru | FORCE_RESIZE_APP | 174042936 | Pomija tryb zgodności rozmiaru w przypadku zmian w konfiguracji aplikacji. |
FORCE_NON_RESIZE_APP | 181136395 | Wymusza tryb zgodności z rozmiarem w przypadku zmian konfiguracji. | |
Format obrazu | OVERRIDE_MIN_ASPECT_RATIO | 174042980 | Zastąpienie w Gatekeeper, które musi być włączone, aby zastosować inne zastąpienia formatu obrazu. |
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY | 203647190 | Jeśli ta opcja jest włączona (domyślnie), limity zastępują zakres tylko do aktywności w orientacji pionowej. | |
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM | 180326845 | Zmień minimalne proporcje na 3:2. | |
OVERRIDE_MIN_ASPECT_RATIO_LARGE | 180326787 | Zmienia minimalny format obrazu na 16:9. | |
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN | 208648326 | Zmienia minimalny współczynnik proporcji, aby pasował do 50% rozmiaru wyświetlacza (lub współczynnika proporcji podzielonego ekranu). | |
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN | 218959984 | Wyłącza zastępowanie minimalnego formatu obrazu, aby aplikacje wyświetlały się na pełnym ekranie, gdy urządzenie jest ustawione pionowo. | |
Orientacja | OVERRIDE_ANY_ORIENTATION | 265464455 | Umożliwia zastąpienie dowolnej orientacji. |
OVERRIDE_ANY_ORIENTATION_TO_USER | 310816437 | Zastępuje ograniczenia dotyczące orientacji, zmiany rozmiaru i współczynnika proporcji obrazu. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT | 265452344 | Zastępuje orientację pionową, gdy aktywność ma nieokreśloną orientację. | |
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR | 265451093 | Zastępuje orientację nosensor (użyj naturalnej orientacji urządzenia) wtedy, gdy aktywność ma nieokreśloną orientację. |
|
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE | 266124927 | Obróci aplikacje tylko w układzie poziomym o 180 stopni. | |
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA | 265456536 | Ogranicza zakres zastępowania orientacji do sytuacji, gdy aplikacja jest podłączona do kamery. | |
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION | 255940284 | Gdy zadanie jest wyświetlane na pełnym ekranie (w tym w trybie letterbox), wyświetlacz ustawia się na stałą orientację poziomą. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION | 254631730 | Ignoruje żądania dotyczące orientacji z aplikacji, aby uniknąć nieskończonych pętli obracania. | |
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED | 273509367 | Ignoruje powtarzające się prośby o orientację podczas ponownego uruchamiania działania. Jeśli Android wykryje, że aplikacja w ciągu 1 sekundy prosi o co najmniej 2 nowe orientacje, system uzna to za nieskończony cykl obracania i zastosuje zastąpienie. | |
OVERRIDE_RESPECT_REQUESTED_ORIENTATION | 236283604 | Zapobiega letterboxingowi przez wyłączenie ustawienia ignorowania prośby o orientację przez producenta urządzenia. | |
Interfejsy API piaskownicy | NEVER_SANDBOX_DISPLAY_APIS | 184838306 | Uniemożliwia zmianę działania wyświetlanych interfejsów API. |
ALWAYS_SANDBOX_DISPLAY_APIS | 185004937 | Wymusza interfejsy API Display w aplikacji, aby zwracały granice aplikacji. Interfejsy API Display zwracają logiczne granice obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API Display zwracają granice aplikacji, co prowadzi do problemów z interfejsem. |
|
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS | 237531167 | Wymusza na interfejsach API View używanych w aplikacji zwracanie granic aplikacji. Interfejsy API View zwracają logiczne granice obszaru wyświetlania, ale czasami aplikacja zakłada, że interfejsy API View zwracają granice aplikacji, co prowadzi do problemów z interfejsem. |
|
Zgodność z aparatem | OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION | 263959004 | Wyłącza wymuszony obrót. Domyślnie wszystkie aplikacje aparatu z ustawionymi orientacjami są wymuszająco obracane, gdy otwarta jest podgląd aparatu. |
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH | 264304459 | Usuwa domyślne twarde odświeżanie stosowane, gdy podgląd aparatu jest wymuszająco obracany. | |
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE | 264301586 | Przełącza twarde odświeżanie na miękkie odświeżanie, gdy podgląd aparatu jest wymuszająco obracany, co pomaga zachować stan podczas wymuszonej rotacji. Domyślnie Android stosuje odświeżanie twarde, gdy podgląd aparatu jest wymuszająco obracany. Twarde odświeżenie może spowodować problemy z utratą stanu aplikacji lub zaciemnieniem ekranu w zależności od tego, jak aplikacje zapisały poprzedni stan w pamięci podręcznej. | |
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT | 250678880 | Przycina bufor obrazu z wewnętrznego przedniego aparatu. Jeśli zastąpienie jest wyłączone, przycinanie wewnętrznego przedniego aparatu zostanie usunięte, a pole widzenia podglądu aparatu zostanie powiększone. Domyślnie na niektórych urządzeniach składanych (patrz urządzenia referencyjne) system przycina podgląd wszystkich aplikacji aparatu, gdy jest używany wewnętrzny przedni aparat. | |
Różne | OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS | 263259275 | Zapobiega czarnemu kolorowi aplikacji, gdy straci ważność w trybie podzielonego ekranu. Aplikacja czeka na skupienie uwagi przed wyświetleniem treści, co może spowodować jej zawieszenie lub przyciemnienie. Zastąpienie pozwala Androidowi wysłać do aplikacji fałszywe zdarzenie zaznaczenia, które sygnalizuje jej, że ponownie rozpoczyna rysowanie treści. |
FORCE_RESIZE_APP
Wymusza możliwość zmiany rozmiaru pakietów, do których zastosowano zastąpienie. Nie wpływa na to, czy aplikacja może być uruchamiana w trybie wielookiennym, ale pozwala jej zmieniać rozmiar bez przechodzenia w tryb zgodności z rozmiarem ekranu.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
W manifeście aplikacji ustaw atrybut android:resizeableActivity
na true
lub, aby zmienić rozmiar przy wyłączaniu trybu wielu okien przy użyciu funkcji android:resizeableActivity=false
, ustaw flagę metadanych android.supports_size_changes
na true
.
Optymalizacja aplikacji
Korzystaj z układów elastycznych i adaptacyjnych, aby umożliwić aplikacjom dostosowywanie się do wszystkich rozmiarów i formatów reklam. Zobacz Obsługa różnych rozmiarów ekranu.
Jak wyłączyć lub wyłączyć zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false
.
Flagi właściwości do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie i zmienić rozmiar aplikacji:
adb shell am compat enable FORCE_RESIZE_APP <package>
Aby usunąć zastąpienie:
adb shell am compat disable FORCE_RESIZE_APP <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
FORCE_NON_RESIZE_APP
Wymusza, aby pakiety, do których zostało zastosowane zastąpienie, nie podlegały zmianie rozmiaru i w przypadku zmian konfiguracji włączają tryb zgodności rozmiaru.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
W pliku manifestu aplikacji ustaw zarówno atrybut android:resizeableActivity
, jak i flagę metadanych android.supports_size_changes
na false
i zadeklaruj ograniczenie orientacji lub formatu obrazu.
Optymalizacja aplikacji
Wszystkie aplikacje, które po zmianie rozmiaru działają prawidłowo, powinny mieć wartość android:resizeableActivity
lub android.supports_size_changes
ustawioną na true
.
Inne aplikacje powinny być ulepszone, aby dobrze działały po zmianie rozmiaru. Zobacz android:resizeableActivity.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES
na false
.
Flagi właściwości do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie i uniemożliwić zmianę rozmiaru aplikacji:
adb shell am compat enable FORCE_NON_RESIZE_APP <package>
Aby usunąć zastąpienie:
adb shell am compat disable FORCE_NON_RESIZE_APP <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO
Bramka dla wszystkich zastąpień, które narzucają określony minimalny format obrazu.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw wartość android:minAspectRatio
na poziomie aktywności lub aplikacji.
Jak optymalizować aplikacje
Nie ustawiaj ograniczeń formatu obrazu w swojej aplikacji. Upewnij się, że aplikacja obsługuje różne rozmiary ekranów. Używaj klas rozmiarów okien, aby obsługiwać różne układy w zależności od ilości miejsca, jaką aplikacja ma na ekranie. Zapoznaj się z interfejsami API Compose WindowSizeClass
i View WindowSizeClass
.
Jak wyłączyć lub wyłączyć zastąpienie
Określ ograniczenie formatu obrazu lub ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE
na false
.
Flagi właściwości do dostosowania zastąpienia
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
android:value="false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>
Uwaga: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY
Ogranicza ustawienia aplikacji, które narzucają określony minimalny format obrazu w przypadku aktywności w orientacji pionowej. Domyślnie jest ona włączona i obowiązuje tylko wtedy, gdy włączona jest też zasada OVERRIDE_MIN_ASPECT_RATIO
.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi właściwości do dostosowania zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM
Ustawia minimalny format obrazu aktywności na średni (3:2).
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak optymalizować aplikacje
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub wyłączyć zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO_LARGE
Ustawia minimalny współczynnik proporcji aktywności na dużą wartość (16:9)
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi właściwości do dostosowania zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN
Umożliwia użycie proporcji ekranu podzielonego. Pozwala aplikacji wykorzystać całe dostępne miejsce w trybie podzielonego ekranu, bez czarnych pasów.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Optymalizacja aplikacji
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi właściwości do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN
Wyłącza minimalne zastępowanie minimalnego formatu obrazu na pełnym ekranie w orientacji pionowej, aby wykorzystywać całe dostępne miejsce na ekranie.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak optymalizować aplikacje
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Flagi właściwości do dostosowania zastępowania
Zobacz OVERRIDE_MIN_ASPECT_RATIO.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>
Uwaga: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ANY_ORIENTATION
Włącza te zastąpienia umożliwiające zastąpienie dowolnej orientacji:
- 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: pozwalając systemowi na zniszczenie i ponowne utworzenie aplikacji lub samodzielne zarządzanie zmianami konfiguracji. Jeśli samodzielnie zarządzasz zmianami konfiguracji, stan aplikacji można zachować za pomocą funkcji ViewModel
. W bardzo nielicznych przypadkach możesz zablokować orientację tylko na małych ekranach, ale może to nie skalować się i pozwolić użytkownikowi obracać aplikację zgodnie z potrzebami. W Androidzie 12L i nowszych wersjach orientacja może zostać zastąpiona przez konfigurację urządzenia. Więcej informacji o obsługiwaniu zmian konfiguracji i obsługiwaniu wszystkich orientacji znajdziesz w artykułach Obsługa zmian konfiguracji, Omówienie ViewModel i Ograniczenie orientacji aplikacji na telefonach, ale nie na urządzeniach z dużym ekranem.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE
na false
.
Flagi właściwości do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_ANY_ORIENTATION_TO_USER
Umożliwia aplikacji wypełnienie dostępnego miejsca. Zastępuje wszelkie ograniczenia dotyczące orientacji, możliwości zmiany rozmiaru i proporcji obrazu określone w pliku manifestu aplikacji. Ponadto ignoruje wszystkie połączenia z numerem Activity#setRequestedOrientation()
.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Nie ustawiaj atrybutu pliku manifestu
android:screenOrientation
ani ustawiaj go na"user"
.Ustaw atrybut pliku manifestu
android:resizeableActivity
natrue
.Aby umożliwić zmianę rozmiaru aplikacji przy wyłączonym trybie wielu okien za pomocą parametru
android:resizeableActivity=false
, ustaw flagę metadanychandroid.supports_size_changes
natrue
. Nie ustawiaj wartościminAspectRatio
animaxAspectRatio
.
Optymalizacja aplikacji
Umożliw aplikacji obsługę wszystkich orientacji. Nie ustawiaj specyfikacji screenOrientation
w manifeście aplikacji. Obsługuj rozmiary aplikacji, tryb wielookienkowy i wszystkie proporcje ekranu, ustawiając atrybut android:resizeableActivity
w pliku manifestu aplikacji na true
. Zobacz Obsługa różnych rozmiarów ekranu.
Jak wyłączyć lub wyłączyć zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi właściwości do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_UNDEFINED_ORIENTATION_DO_PORTRAIT
Umożliwia orientację pionową podczas wszystkich aktywności w pakiecie. Jeśli nie jest włączona opcja OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy działanie nie określiło żadnej innej stałej orientacji.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak optymalizować aplikacje
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
Włącza orientację bez czujnika dla wszystkich aktywności w pakiecie. Jeśli nie włączysz parametru OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa żadnej innej stałej orientacji.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub wyłączyć zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi właściwości do dostosowania zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>
Uwaga: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
Włącza orientację reverseLandscape dla wszystkich aktywności w pakiecie. Jeśli nie włączysz parametru OVERRIDE_ANY_ORIENTATION, zastąpienie jest używane tylko wtedy, gdy aktywność nie określa żadnego innego stałego ułożenia.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA
Ograniczenia OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR, i OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE zastąpień mają zastosowanie tylko wtedy, gdy połączenie z kamerą jest aktywne.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak optymalizować aplikacje
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Zobacz OVERRIDE_ANY_ORIENTATION
.
Flagi usług do dostosowania zastępowania
Zobacz OVERRIDE_ANY_ORIENTATION
.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION
Ogranicza orientację ekranu do naturalnej orientacji poziomej, gdy są spełnione te warunki:
- Aktywność jest wyświetlana na pełnym ekranie
- Właściwość komponentu Zrezygnuj
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
nie jest włączona - Ustawienie żądania ignorowania orientacji przez producenta urządzenia jest włączone dla wyświetlacza.
- Naturalna orientacja wyświetlacza to pozioma.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
na false
.
Flagi właściwości do dostosowania zastąpienia
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION
Włącza zasadę zgodności, która pomija aktualizowanie orientacji aplikacji w odpowiedzi na wywołanie Activity#setRequestedOrientation()
, gdy aplikacja jest ponownie uruchamiana lub ma aktywne działanie dotyczące zgodności z aparatami.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
na true
.
Jak optymalizować aplikacje
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION
na false
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>
Uwaga: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
Włącza zasadę zgodności, która w odpowiedzi na wywołanie aplikacji ignoruje żądaną orientację w aplikacji
Activity#setRequestedOrientation()
więcej niż dwa razy na sekundę, jeśli działanie nie ma czarnych pasów w przypadku stałej orientacji.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.
Optymalizacja aplikacji
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED
na false
.
Flagi właściwości do dostosowania zastąpienia
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
android:value="false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION
Wyklucza pakiety z zachowania ignorowania prośby o zignorowanie orientacji, które może być włączone przez producentów urządzeń w przypadku obszaru ekranu lub całego ekranu.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Nie dotyczy. Problem powinien zostać rozwiązany w logice aplikacji.
Jak optymalizować aplikacje
Zobacz OVERRIDE_ANY_ORIENTATION
.
Jak wyłączyć lub zrezygnować z zastąpienia
Nie ma możliwości rezygnacji. Wyłączenie zastępowania może być niebezpieczne, jeśli aplikacja jest niezgodna z urządzeniem, na którym włączono ustawienie żądania ignorowania orientacji przez producenta urządzenia. Aby wyłączyć zastąpienie, skontaktuj się z zespołem ds. relacji z deweloperami Androida.
Flagi właściwości do dostosowania zastępowania
Brak flag właściwości dla tego zastąpienia.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
INTERFEJSY API NEVER_SANDBOX_DISPLAY_API
Wymusza, aby pakiety nigdy nie miały zastosowanego piaskownicy interfejsu API Display
w przypadku aktywności w trybie letterbox lub zgodności z rozmiarem. Interfejsy API Display
nadal będą podawać granice obszaru wyświetlania.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Zadeklaruj działania z możliwością zmiany rozmiaru, ustawiając atrybut manifestu android:resizeableActivity
na true
lub flagę metadanych android.supports_size_changes
na true
.
Jak optymalizować aplikacje
Aplikacje, które deklarują, że można je w pełni zmieniać, nigdy nie powinny polegać na rozmiarze wyświetlacza do pozycjonowania elementów interfejsu. Przeprowadź migrację aplikacji na aktualne interfejsy API, które zapewniają WindowMetrics
. Jeśli używasz Jetpack Compose, korzystaj z interfejsu API WindowSizeClass
, aby wyświetlać interfejs użytkownika w zależności od tego, jaką część ekranu zajmuje aktualnie wyświetlana aplikacja. Zapoznaj się z sekcją Używanie klas rozmiaru okna.
Jak wyłączyć lub zrezygnować z zastąpienia
Nie można z tego zrezygnować. Migracja z wycofanych interfejsów API.
Flagi właściwości do dostosowania zastąpienia
Brak flag właściwości dla tego zastąpienia.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>
Aby usunąć zastąpienie:
adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
ALWAYS_SANDBOX_DISPLAY_APIS
Wymusza, aby pakiety interfejsu API Display
były zawsze stosowane do piaskownicy niezależnie od trybu okna. Interfejsy API Display
zawsze określają granice aplikacji.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zadeklaruj aktywności, których nie można zmienić, ustawiając atrybut android:resizeableActivity
na false
lub flagę metadanych android.supports_size_changes
na false
.
Jak optymalizować aplikacje
Aplikacje, które deklarują, że można je w pełni zmieniać, nigdy nie powinny polegać na rozmiarze wyświetlacza do pozycjonowania elementów interfejsu. Przenieś swoją aplikację z wycofanych interfejsów API do aktualnych interfejsów API, które zapewniają WindowMetrics
. Zobacz WindowMetricsCalculator
.
Jak wyłączyć lub zrezygnować z zastąpienia
Nie można z tego zrezygnować. Migracja z wycofanych interfejsów API.
Flagi właściwości do dostosowania zastąpienia
Brak flag właściwości dla tego zastąpienia.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Aby usunąć zastąpienie:
adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>
Uwaga: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
Wymusza umieszczenie w piaskownicy tych interfejsów API View
:
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Rozwiąż ten problem w kodzie aplikacji, korzystając z interfejsów API, które podają granice okna aplikacji i przesunięcia względem okna aplikacji, a nie granice wyświetlacza urządzenia i przesunięcia względem wyświetlacza urządzenia.
Jak optymalizować aplikacje
Aplikacje powinny używać interfejsów API View
, biorąc pod uwagę możliwość zastosowania letterboxa i trybu wielu okien. Patrz WindowMetricsCalculator
.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS
na false
.
Flagi właściwości do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
android:value="false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION
Wyłącza wymuszoną rotację. Ulepszenie wrażeń użytkowników w niektórych aplikacjach.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
na false
.
Optymalizacja aplikacji
Nie polegaj na zapisanych w pamięci podręcznej informacjach o orientacji czujnika aparatu ani na informacjach o urządzeniu. Wskazówki dotyczące zgodności z aparatem znajdziesz w artykułach Wprowadzenie do wizjera aparatu i Obsługa powierzchni z możliwością zmiany rozmiaru w aplikacji aparatu.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION
na true
.
Flagi właściwości do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, które usuwa wymuszanie rotacji:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Aby usunąć zastąpienie, które umożliwia wymuszenie rotacji:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>
Uwaga: te polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH
Wyłącza odświeżanie aktywności po przymusowym obracaniu. poprawia wrażenia użytkowników, gdy odświeżenie powoduje utratę stanu w aplikacjach.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
na false
.
Optymalizacja aplikacji
Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH
na true
.
Flagi usług do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, skutkujące usunięciem odświeżenia aktywności:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Aby usunąć zastąpienie, które umożliwia odświeżanie aktywności:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>
Uwaga: polecenia tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
Powoduje, że pakiety, w których jest on stosowany do odświeżania aktywności, są odświeżane za pomocą cyklu onResume()
→ onPause()
→ onResume()
, a nie onResume()
→
onStop()
→ onResume()
po obróceniu siłą zgodności z aparatem.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
na true
.
Jak optymalizować aplikacje
Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE
na false
.
Flagi właściwości do dostosowania zastępowania
<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>
Uwaga: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT
Wymusza przycięcie obrazu wyjściowego z aparatu do przeciwnej orientacji, jeśli orientacja pionowa jest niezgodna z naturalną orientacją urządzenia. Wiele aplikacji nie podejmuje takiej sytuacji i w przeciwnym razie wyświetla rozciągnięte obrazy.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
na true
.
Jak optymalizować aplikacje
Zobacz OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.
Jak wyłączyć lub wyłączyć zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT
na false
.
Flagi właściwości do dostosowania zastąpienia
<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, które obejmuje przycięcie wewnętrznego przedniego aparatu:
adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Aby usunąć zastąpienie, które spowoduje usunięcie przycięcia wewnętrznego przedniego aparatu:
adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>
Uwaga: te polecenia są stosowane tylko tymczasowo lub w celu usunięcia zastąpienia.
OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION
Uniemożliwia aplikacjom rezygnację z udostępniania ekranu aplikacji (patrz Wyświetlanie multimediów). Wdrażane, gdy aplikacje nadużywają interfejsu API createConfigForDefaultDisplay()
, aby wymuszać przechwytywanie całego ekranu i narażać prywatność użytkownika, ujawniając zawartość powiadomień, które są przechwytywane w trybie pełnoekranowym, ale nie w trybie udostępniania ekranu aplikacji, oraz wszystkich aplikacji niezależnie od trybu okna.
Jak aplikacje mogą osiągnąć ten sam efekt co zastąpienie
Zezwalaj na domyślne wyświetlanie multimediów (zaimplementowane w Androidzie 14 na poziomie interfejsu API 34 w ramach interfejsu createScreenCaptureIntent()
), co umożliwia użytkownikom określenie, czy chcą udostępnić pełny ekran, czy pojedyncze okno aplikacji niezależnie od trybu okna aplikacji. Możesz też wywołać metodę createScreenCaptureIntent(MediaProjectionConfig)
z argumentem MediaProjectionConfig
zwróconym z wywołania do createConfigForUserChoice()
.
Optymalizacja aplikacji
Umożliwia użytkownikom wybranie, czy podczas wyświetlania multimediów mają udostępniać cały ekran urządzenia czy okno aplikacji. Od Androida 14 jest to zachowanie domyślne.
Umożliw zmianę rozmiaru aplikacji (resizeableActivity="true"
), aby obsługiwała tryb wielookien.
Jak wyłączyć lub zrezygnować z zastąpienia
Ze względu na poważne znaczenie prywatności użytkownika Twoja aplikacja nie może wyłączyć tej zastępczej funkcji ani zrezygnować z niej.
Flagi właściwości do dostosowania zastąpienia
Brak.
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie, które anuluje rezygnację z udostępniania ekranu na części (czyli włącza udostępnianie ekranu na części):
adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Aby usunąć zastąpienie, które umożliwia aplikacji rezygnację z częściowego udostępniania ekranu:
adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>
Uwaga: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.
OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
Umożliwia wysyłanie fałszywego stanu skupienia w przypadku aplikacji, które nie są w centrum uwagi w trybie podzielonego ekranu. Niektóre silniki gier czekają na uzyskanie fokusa przed narysowaniem zawartości aplikacji. Dzięki temu aplikacje nie pozostają czarne, gdy są wznawiane i jeszcze nie mają fokusa.
Jak aplikacje mogą osiągnąć taki sam efekt jak zastąpienie
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na true
.
Jak optymalizować aplikacje
Możesz uniknąć tego problemu, jeśli Twoja aplikacja dobrze obsługuje różne orientacje i zmiany konfiguracji. Przygotuj aplikację na duży ekran, postępując zgodnie ze wskazówkami dotyczącymi jakości aplikacji na dużym ekranie.
Jeśli używasz silnika gry Unity, uaktualnij grę do wersji 2019.4.40 lub nowszej i ponownie wyeksportuj grę. Zostaw zaznaczoną opcję Resizable Window
w ustawieniach odtwarzacza Android.
Jak wyłączyć lub zrezygnować z zastąpienia
Ustaw flagę właściwości PROPERTY_COMPAT_ENABLE_FAKE_FOCUS
na false
.
Flagi właściwości do dostosowania zastępowania
<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
android:value="true|false"/>
Polecenia adb do testowania zastąpienia
Aby zastosować zastąpienie:
adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Aby usunąć zastąpienie:
adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>
Uwaga: polecenia te tylko tymczasowo stosują lub usuwają zastąpienie.
Dodatkowe materiały
- Wytyczne dotyczące jakości aplikacji na duży ekran
- Wytyczne dotyczące podstawowej jakości aplikacji