Bei faltbaren Geräten kann die Nutzerfreundlichkeit optimiert werden, indem das Verhalten bei der Bildschirmdrehung an den physischen Zustand des Geräts angepasst wird. Sie können beispielsweise festlegen, dass sich der Bildschirm automatisch dreht, wenn das Gerät im Tablet-Modus aufgeklappt ist, aber im Hochformat gesperrt ist, wenn das Gerät zusammengeklappt ist.
Ab Android 13 können die Einstellungen für die automatische Drehung basierend auf dem Gerätestatus angepasst werden, z. B. gefaltet, aufgeklappt oder halb gefaltet (Tischmodus).
Abbildung 1:Automatische Drehung basierend auf dem Gerätestatus, wie sie dem Nutzer angezeigt wird.
Automatische Drehung basierend auf dem Gerätestatus aktivieren
Wenn Sie die gerätestatusbasierte automatische Drehung aktivieren und konfigurieren möchten, erstellen Sie ein Geräte-Overlay für die config.xml-Datei des Frameworks:
Konfiguriere das Standardverhalten für die automatische Drehung für verschiedene Gerätepositionen, indem du das Integer-Array
config_perDeviceStateRotationLockDefaultsim Geräte-Overlayconfig.xmlfestlegst:<!-- 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 so konfiguriert ist, werden alle Anfragen zum Abrufen oder Festlegen der Einstellung für die automatische Drehung an die Fallback-Position weitergeleitet.Wenn beispielsweise die
HALF_OPENED-Haltung auf dieOPENED-Haltung zurückfällt:- Wenn Sie die Einstellung für die automatische Drehung für
HALF_OPENEDlesen, wird die aktuelle Einstellung fürOPENEDzurückgegeben. - Wenn Sie eine neue Einstellung für die automatische Drehung schreiben, während sich das Gerät in der
HALF_OPENED-Position befindet, wird die Einstellung für dieOPENED-Position aktualisiert.
- Wenn Sie die Einstellung für die automatische Drehung für
Beschreibungen für jede vom Nutzer einstellbare Geräteposition konfigurieren. Füllen Sie das String-Array
config_settableAutoRotationDeviceStatesDescriptionsim Overlay der Einstellungen 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>Sie müssen die richtigen APIs verwenden, 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 der SystemUI oder im Launcher
RotationPolicy#setRotationLock(...). - Verwenden Sie im Window Manager
DisplayRotation#freezeRotation()oderthawRotation().
- Verwenden Sie in der SystemUI oder im Launcher
So ändern Sie die Einstellung für die Rotationssperre für einen bestimmten Gerätestatus (ändert
DEVICE_STATE_ROTATION_LOCK):- Verwenden Sie
requestDeviceStateAutoRotateSettingChange(...)ausRotationPolicyoderDeviceStateAutoRotateSettingManager.
- Verwenden Sie
Details zur Implementierung
Die Einstellungen und wichtigsten Schlüsselklassen, die das automatische Drehen auf einem faltbaren Gerät steuern, werden in den folgenden Abschnitten beschrieben.
Einstellungen
Das System verwendet die folgenden beiden Einstellungen, um die automatische Drehung 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 die automatische Drehung für die aktuelle Gerätehaltung aktiviert ist.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: In dieser Einstellung wird die Einstellung des Nutzers für das automatische Drehen für jede Geräteposition (z. B. zusammengeklappt oder aufgeklappt) gespeichert. So kann das System die richtige Einstellung anwenden, wenn sich die Geräteausrichtung ändert.Die Einstellung wird als durch Doppelpunkte getrennter String gespeichert. Jedes Wertepaar steht für eine Geräteausrichtung und die entsprechende Drehungseinstellung. Das Format ist:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...Die Werte für die Rotation sind:
0: Wird ignoriert (die Einstellung für eine Fallback-Haltung wird verwendet)1: Gesperrt (automatisches Drehen ist deaktiviert)2: Entriegelt (automatisches Drehen ist aktiviert)
Der String
"0:2:2:1"bedeutet beispielsweise:- Im zusammengeklappten Zustand (Haltung
0) ist das automatische Drehen entsperrt (2). - Im aufgeklappten Zustand (Position
2) ist die automatische Drehung gesperrt (1).
Wichtige Klassen
Die Logik für die Verwaltung der Einstellungen für die automatische Drehung basierend auf dem Gerätestatus 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äteausrichtung ändert, wirdACCELEROMETER_ROTATIONentsprechend der Einstellung des Nutzers für den neuen Status aktualisiert. So wird sichergestellt, dass alle Änderungen anACCELEROMETER_ROTATIONfür die aktuelle Geräteausrichtung inDEVICE_STATE_ROTATION_LOCKgespeichert werden und Änderungen anDEVICE_STATE_ROTATION_LOCKfür die aktuelle Ausrichtung inACCELEROMETER_ROTATIONübernommen werden.DeviceStateAutoRotateSettingController(Einstellungen):Steuere die Benutzeroberfläche auf der Seite mit den einstellungsbasierten Einstellungen für die automatische Drehung des Geräts.PostureDeviceStateConverter: Konvertiert zwischen generischen Geräte-Status-IDs und den Geräte-Posture-IDs, die von dieser Funktion verwendet werden.
Zertifizierungsstufe
Da das Verhalten dieses Features stark von der Konfiguration des OEM abhängt, gibt es dafür keine spezifischen CTS-Tests. Sie müssen manuelle Tests durchführen, um zu prüfen, ob sich die Einstellungen für die automatische Drehung wie erwartet ändern, wenn das Gerät zwischen den verschiedenen von Ihnen konfigurierten physischen Zuständen wechselt.