W przypadku urządzeń składanych można zoptymalizować komfort użytkowania, dostosowując zachowanie rotacji ekranu do stanu fizycznego urządzenia. Możesz na przykład ustawić automatyczne obracanie ekranu, gdy urządzenie jest rozłożone w pozycji przypominającej tablet, ale zablokowane w orientacji pionowej, gdy urządzenie jest złożone.
Od Androida 13 Android ma możliwość dostosowywania ustawień autoobracania na podstawie stanów urządzenia, takich jak złożony, rozłożony lub częściowo złożony (tryb stołowy).
Rysunek 1. Ustawienia autoobracania na podstawie stanu urządzenia widoczne dla użytkownika.
Włączanie ustawienia autoobracania na podstawie stanu urządzenia
Aby włączyć i skonfigurować autoobracanie na podstawie stanu urządzenia, utwórz nakładkę urządzenia dla pliku config.xml frameworka w ten sposób:
Skonfiguruj domyślne zachowanie autoobracania dla różnych pozycji urządzenia, wypełniając tablicę liczb całkowitych
config_perDeviceStateRotationLockDefaultsw nakładceconfig.xmlurządzenia:<!-- 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 zabezpieczeń urządzenia, który musisz określić, gdy wartość stanu zabezpieczeń toSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Gdy pozycja jest skonfigurowana w ten sposób, wszystkie żądania pobrania lub ustawienia preferencji autoobracania są przekierowywane do pozycji rezerwowej.Jeśli na przykład pozycja
HALF_OPENEDjest rezerwowa dla pozycjiOPENEDposture:- Odczytanie ustawienia autoobracania dla pozycji
HALF_OPENEDzwraca bieżące ustawienie dla pozycjiOPENED. - Zapisanie nowej preferencji autoobracania, gdy urządzenie jest w pozycji
HALF_OPENEDaktualizuje preferencję dla pozycjiOPENED.
- Odczytanie ustawienia autoobracania dla pozycji
Skonfiguruj opisy dla każdego stanu zabezpieczeń urządzenia, który może ustawić użytkownik. Wypełnij tablicę tekstową
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 zapobiec niespójnemu działaniu, używaj odpowiednich interfejsów API do programowego modyfikowania tych ustawień, zamiast bezpośrednio zapisywać je u dostawców ustawień:
Aby zmienić bieżący stan blokady rotacji (modyfikuje
ACCELEROMETER_ROTATION):- W SystemUI lub Menu z aplikacjami użyj
RotationPolicy#setRotationLock(...). - W Menedżerze okien użyj
DisplayRotation#freezeRotation()lubthawRotation().
- W SystemUI lub Menu z aplikacjami użyj
Aby zmienić preferencję blokady rotacji dla określonego stanu urządzenia (modyfikuje
DEVICE_STATE_ROTATION_LOCK):- Użyj
requestDeviceStateAutoRotateSettingChange(...)zRotationPolicylubDeviceStateAutoRotateSettingManager.
- Użyj
Szczegóły implementacji
Ustawienia i podstawowe klasy kluczy, które kontrolują zachowanie autoobracania w przypadku urządzenia składanego, opisaliśmy w sekcjach poniżej.
Ustawienia
System używa tych 2 ustawień do zarządzania autoobracaniem:
Settings.System.ACCELEROMETER_ROTATION: to główne ustawienie autoobracania. W przypadku urządzenia składanego jego wartość odzwierciedla, czy autoobracanie jest włączone dla bieżącej pozycji urządzenia.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: to ustawienie przechowuje preferencje autoobracania użytkownika dla każdej pozycji urządzenia (np. złożonej lub rozłożonej). Dzięki temu system może zastosować odpowiednią preferencję, gdy zmieni się pozycja 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 rotacji. Format jest taki:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...Wartości rotacji to:
0: ignorowane (używane jest ustawienie pozycji rezerwowej)1: zablokowane (autoobracanie jest wyłączone)2: odblokowane (autoobracanie jest włączone)
Na przykład ciąg znaków
"0:2:2:1"oznacza:- W przypadku stanu złożonego (pozycja
0) autoobracanie jest odblokowane (2). - W przypadku stanu rozłożonego (pozycja
2) autoobracanie jest zablokowane (1).
Kluczowe klasy
Logika zarządzania ustawieniami autoobracania 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 odbiorników zmian.DeviceStateAutoRotateSettingController(Menedżer okien): SynchronizujeACCELEROMETER_ROTATIONiDEVICE_STATE_ROTATION_LOCK. Gdy zmieni się stan zabezpieczeń urządzenia, aktualizujeACCELEROMETER_ROTATIONna podstawie preferencji użytkownika dla nowego stanu. Dba o to, aby każda zmianaACCELEROMETER_ROTATIONbyła zapisywana z powrotem wDEVICE_STATE_ROTATION_LOCKdla bieżącego stanu zabezpieczeń urządzenia, a zmiany wDEVICE_STATE_ROTATION_LOCKdla bieżącego stanu zabezpieczeń były odzwierciedlane wACCELEROMETER_ROTATION.DeviceStateAutoRotateSettingController(aplikacja Ustawienia): steruje interfejsem na stronie ustawień autoobracania na podstawie stanu urządzenia.PostureDeviceStateConverter: konwertuje ogólne identyfikatory stanu urządzenia na identyfikatory pozycji urządzenia używane przez tę funkcję.
Walidacja
Ponieważ działanie tej funkcji jest w dużym stopniu zależne od konfiguracji OEM, nie ma dla niej konkretnych testów CTS. Musisz przeprowadzić testy ręczne, aby sprawdzić, czy ustawienia autoobracania zmieniają się zgodnie z oczekiwaniami, gdy urządzenie przechodzi między różnymi skonfigurowanymi stanami fizycznymi.