Bei faltbaren Geräten kann die Nutzerfreundlichkeit optimiert werden, indem das Verhalten der Bildschirmrotation an den physischen Zustand des Geräts angepasst wird. Sie können beispielsweise festlegen, dass sich der Bildschirm automatisch dreht, wenn das Gerät in einer tabletähnlichen Position aufgeklappt ist, aber im Hochformat gesperrt ist, wenn das Gerät zusammengeklappt ist.
Ab Android 13 können die Einstellungen für das automatische Drehen basierend auf dem Gerätezustand angepasst werden, z. B. zusammengeklappt, aufgeklappt oder halb aufgeklappt (Tischmodus).
Abbildung 1 : Gerätezustandsbasierte Einstellungen für das automatische Drehen aus Nutzersicht.
Gerätezustandsbasierte Einstellung für das automatische Drehen aktivieren
Wenn Sie das gerätezustandsbasierte automatische Drehen aktivieren und konfigurieren möchten, erstellen Sie eine Geräteüberlagerung für die Datei config.xml des Frameworks. Gehen Sie dazu so vor:
Konfigurieren Sie das Standardverhalten für das automatische Drehen für verschiedene Gerätepositionen, indem Sie das
config_perDeviceStateRotationLockDefaultsInteger-Array in der Überlagerungconfig.xmlIhres Geräts ausfüllen:<!-- 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-keyist ein Verweis auf eine andere Geräteposition. Sie müssen angeben, wann der Wert für eine PositionSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNOREDist. Wenn eine Position auf diese Weise konfiguriert ist, werden alle Anfragen zum Abrufen oder Festlegen der Einstellung für das automatische Drehen an die Fallback-Position weitergeleitet.Wenn die
HALF_OPENEDPosition beispielsweise auf dieOPENEDPosition zurückgreift:- Wenn Sie die Einstellung für das automatische Drehen für
HALF_OPENEDlesen, wird die aktuelle Einstellung fürOPENEDzurückgegeben. - Wenn Sie eine neue Einstellung für das automatische Drehen festlegen, während das Gerät
HALF_OPENEDwird die Einstellung für die PositionOPENEDaktualisiert.
- Wenn Sie die Einstellung für das automatische Drehen für
Konfigurieren Sie Beschreibungen für jede vom Nutzer festlegbare Geräteposition. Füllen Sie das String-Array
config_settableAutoRotationDeviceStatesDescriptionsin der Überlagerung der Einstellungen-App Ihres Geräts aus:<!-- 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>Verwenden Sie die richtigen APIs, um diese Einstellungen programmatisch zu ändern, anstatt direkt in die Einstellungsanbieter zu schreiben, um inkonsistentes Verhalten zu vermeiden:
So ändern Sie den aktuellen Status der Rotationssperre (ändert
ACCELEROMETER_ROTATION):- Verwenden Sie in SystemUI oder Launcher
RotationPolicy#setRotationLock(...). - Verwenden Sie in Window Manager
DisplayRotation#freezeRotation()oderthawRotation().
- Verwenden Sie in SystemUI oder Launcher
So ändern Sie die Einstellung für die Rotationssperre für einen bestimmten Gerätezustand (ändert
DEVICE_STATE_ROTATION_LOCK):- Verwenden Sie
requestDeviceStateAutoRotateSettingChange(...)entweder ausRotationPolicyoderDeviceStateAutoRotateSettingManager.
- Verwenden Sie
Details zur Implementierung
Die Einstellungen und wichtigsten Schlüsselklassen, die das Verhalten des automatischen Drehens für ein faltbares Gerät steuern, werden in den folgenden Abschnitten beschrieben.
Einstellungen
Das System verwendet die folgenden beiden Einstellungen, um das automatische Drehen zu verwalten:
Settings.System.ACCELEROMETER_ROTATION: Dies ist die primäre Einstellung für das automatische Drehen. Bei einem faltbaren Gerät gibt der Wert an, ob das automatische Drehen für die aktuelle Geräteposition des Geräts aktiviert ist.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: In dieser Einstellung wird die Einstellung für das automatische Drehen des Nutzers für jede Geräteposition gespeichert (z. B. zusammengeklappt oder aufgeklappt). So kann das System die richtige Einstellung anwenden, wenn sich die Geräteposition ändert.Die Einstellung wird als durch Doppelpunkte getrennter String gespeichert. Jedes Wertepaar stellt eine Geräteposition und die entsprechende Einstellung für das automatische Drehen dar. Das Format ist:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...Die Werte für die Rotation sind:
0: Ignoriert (die Einstellung für eine Fallback-Position wird verwendet)1: Gesperrt (automatisches Drehen ist deaktiviert)2: Entsperrt (automatisches Drehen ist aktiviert)
Der String
"0:2:2:1"bedeutet beispielsweise:- Für den zusammengeklappten Zustand (Position
0) ist das automatische Drehen entsperrt (2). - Für den aufgeklappten Zustand (Position
2) ist das automatische Drehen gesperrt (1).
Wichtige Klassen
Die Logik für die Verwaltung der gerätezustandsbasierten Einstellungen für das automatische Drehen wird von den folgenden Klassen verarbeitet:
DeviceStateAutoRotateSettingManagerImpl: Verwaltet die EinstellungDEVICE_STATE_ROTATION_LOCK. Sie bietet Methoden zum Aktualisieren der Einstellung, zum Abrufen ihres Werts und zum Registrieren von Listenern für Änderungen.DeviceStateAutoRotateSettingController(Window Manager): SynchronisiertACCELEROMETER_ROTATIONundDEVICE_STATE_ROTATION_LOCK. Wenn sich die Geräteposition ändert, wirdACCELEROMETER_ROTATIONbasierend auf der Einstellung des Nutzers für den neuen Zustand aktualisiert. Alle Änderungen anACCELEROMETER_ROTATIONwerden inDEVICE_STATE_ROTATION_LOCKfür die aktuelle Geräteposition gespeichert. Änderungen anDEVICE_STATE_ROTATION_LOCKfür die aktuelle Position werden auf ähnliche Weise inACCELEROMETER_ROTATIONübernommen.DeviceStateAutoRotateSettingController(Einstellungen-App): Steuert die Benutzeroberfläche auf der Seite mit den gerätezustandsbasierten Einstellungen für das automatische Drehen.PostureDeviceStateConverter: Konvertiert zwischen generischen Gerätezustands-IDs und den Gerätepositions-IDs, die von dieser Funktion verwendet werden.
Validierung
Da das Verhalten dieser Funktion stark von der Konfiguration des OEM abhängt, gibt es keine spezifischen CTS-Tests dafür. Sie müssen manuelle Tests durchführen, um zu prüfen, ob sich die Einstellungen für das automatische Drehen wie erwartet ändern, wenn das Gerät zwischen den verschiedenen von Ihnen konfigurierten physischen Zuständen wechselt.