W przypadku urządzeń składanych można zoptymalizować komfort użytkowania, dostosowując zachowanie obracania ekranu do stanu fizycznego urządzenia. Możesz na przykład ustawić automatyczne obracanie ekranu po rozłożeniu urządzenia w trybie tabletu, ale zablokować je w orientacji pionowej, gdy urządzenie jest złożone.
Od Androida 13 system ten może dostosowywać ustawienia automatycznego obracania na podstawie stanu urządzenia, np. złożonego, rozłożonego lub częściowo złożonego (tryb stołowy).
Ilustracja 1. Ustawienia automatycznego obracania na podstawie stanu urządzenia widoczne dla użytkownika.
Włączanie automatycznego obracania na podstawie stanu urządzenia
Aby włączyć i skonfigurować automatyczne obracanie na podstawie stanu urządzenia, utwórz nakładkę urządzenia dla pliku config.xml platformy w ten sposób:
Skonfiguruj domyślne zachowanie automatycznego obracania dla różnych pozycji urządzenia, wypełniając tablicę liczb całkowitych
config_perDeviceStateRotationLockDefaultsw nakładce urządzeniaconfig.xml:<!-- In your device overlay, for example, device/generic/goldfish/phone/overlay/frameworks/base/core/res/res/values/config.xml --> <resources> <!-- Map of device posture to rotation lock setting. Each entry must be in the format "key:value", or "key:value:fallback_key" for example: "0:1" or "2:0:1". The keys are one of Settings.Secure.DeviceStateRotationLockKey, and the values are one of Settings.Secure.DeviceStateRotationLockSetting. --> <integer-array name="config_perDeviceStateRotationLockDefaults"> <item>0:1</item> <!-- CLOSED -> LOCKED --> <item>1:0:2</item> <!-- HALF_OPENED -> IGNORED and fallback to device posture OPENED --> <item>2:2</item> <!-- OPENED -> UNLOCKED --> <item>3:0:0</item> <!-- REAR_DISPLAY -> IGNORED and fallback to device posture CLOSED --> </integer-array> </resources>fallback-keyto odniesienie do innego stanu urządzenia. Musisz określić, kiedy wartość stanu toSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Gdy pozycja jest skonfigurowana w ten sposób, wszystkie żądania pobrania lub ustawienia preferencji automatycznego obracania są przekierowywane do pozycji rezerwowej.Jeśli na przykład postawa
HALF_OPENEDpowróci do postawyOPENED:- Odczytanie ustawienia autoobracania dla
HALF_OPENEDzwraca bieżące ustawienie dlaOPENED. - Zapisanie nowych preferencji automatycznego obracania, gdy urządzenie jest w pozycji
HALF_OPENED, aktualizuje preferencje dla pozycjiOPENED.
- Odczytanie ustawienia autoobracania dla
Skonfiguruj opisy dla każdej pozycji urządzenia, którą może ustawić użytkownik. Wypełnij tablicę ciągów znaków
config_settableAutoRotationDeviceStatesDescriptionsw nakładce aplikacji Ustawienia na urządzeniu:<!-- In your device's Settings app overlay --> <resources> <!-- The settings/preference description for each settable device posture defined in the array "config_perDeviceStateRotationLockDefaults". The item in position "i" describes the auto-rotation setting for the device posture also in position "i" in the array "config_perDeviceStateRotationLockDefaults". --> <string-array name="config_settableAutoRotationDeviceStatesDescriptions"> <item>Auto-rotate when folded</item> <item>@null</item> <!-- No description for state in position 1 (it is not settable by the user) --> <item>Auto-rotate when unfolded</item> </string-array> </resources>Aby uniknąć niespójnego działania, musisz używać odpowiednich interfejsów API do programowego modyfikowania tych ustawień, zamiast bezpośrednio zapisywać je w usługach dostarczających ustawienia:
Aby zmienić bieżący stan blokady obrotu (modyfikuje
ACCELEROMETER_ROTATION):- W interfejsie SystemUI lub Menu z aplikacjami użyj
RotationPolicy#setRotationLock(...). - W Menedżerze okien użyj
DisplayRotation#freezeRotation()lubthawRotation().
- W interfejsie SystemUI lub Menu z aplikacjami użyj
Aby zmienić ustawienie blokady obrotu dla określonego stanu urządzenia (modyfikuje
DEVICE_STATE_ROTATION_LOCK):- Użyj właściwości
requestDeviceStateAutoRotateSettingChange(...)z jednego z tych źródeł:RotationPolicylubDeviceStateAutoRotateSettingManager.
- Użyj właściwości
Szczegóły implementacji
Ustawienia i główne klasy kluczy, które kontrolują zachowanie automatycznego obracania na urządzeniu składanym, opisano w sekcjach poniżej.
Ustawienia
System używa tych 2 ustawień do zarządzania automatycznym obracaniem:
Settings.System.ACCELEROMETER_ROTATION: To główne ustawienie autoobracania. W przypadku urządzenia składanego wartość ta odzwierciedla, czy automatyczne obracanie jest włączone dla bieżącej pozycji urządzenia.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: to ustawienie przechowuje preferencje użytkownika dotyczące autoobracania dla każdej pozycji urządzenia (np. złożonej lub rozłożonej). Dzięki temu system może zastosować odpowiednie ustawienie, gdy zmieni się położenie urządzenia.Ustawienie jest przechowywane jako ciąg znaków rozdzielony dwukropkami. Każda para wartości reprezentuje pozycję urządzenia i odpowiadające jej ustawienie obrotu. Format jest następujący:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...Wartości rotacji to:
0: Ignorowane (używane jest ustawienie dla pozycji rezerwowej)1: Zablokowany (autoobracanie jest wyłączone)2: odblokowany (autoobracanie jest włączone)
Na przykład ciąg znaków
"0:2:2:1"oznacza:- W przypadku złożonego urządzenia (pozycja
0) autoobracanie jest odblokowane (2). - W przypadku rozłożonego urządzenia (pozycja
2) autoobracanie jest zablokowane (1).
Kluczowe klasy
Logika zarządzania ustawieniami automatycznego obracania na podstawie stanu urządzenia jest obsługiwana przez te klasy:
DeviceStateAutoRotateSettingManagerImpl: zarządza ustawieniemDEVICE_STATE_ROTATION_LOCK. Udostępnia metody aktualizowania ustawienia, pobierania jego wartości i rejestrowania odbiorców zmian.DeviceStateAutoRotateSettingController(Menedżer okien): SynchronizujeACCELEROMETER_ROTATIONiDEVICE_STATE_ROTATION_LOCK. Gdy zmieni się położenie urządzenia, zaktualizuje sięACCELEROMETER_ROTATIONzgodnie z ustawieniami użytkownika dla nowego stanu. Dzięki temu każda zmiana wACCELEROMETER_ROTATIONjest zapisywana z powrotem wDEVICE_STATE_ROTATION_LOCKw przypadku bieżącego stanu urządzenia, a zmiany wDEVICE_STATE_ROTATION_LOCKw przypadku bieżącego stanu są odzwierciedlane wACCELEROMETER_ROTATION.DeviceStateAutoRotateSettingController(aplikacja Ustawienia): sterowanie interfejsem na stronie ustawień automatycznego obracania w zależności od stanu urządzenia.PostureDeviceStateConverter: konwertuje ogólne identyfikatory stanu urządzenia na identyfikatory pozycji urządzenia używane przez tę funkcję.
Weryfikacja
Działanie tej funkcji jest w dużym stopniu uzależnione od konfiguracji OEM, dlatego nie ma dla niej konkretnych testów CTS. Musisz przeprowadzić testy ręczne, aby sprawdzić, czy ustawienia automatycznego obracania zmieniają się zgodnie z oczekiwaniami, gdy urządzenie przechodzi między różnymi skonfigurowanymi stanami fizycznymi.