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 wie ein Tablet 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 auf dem Gerätestatus basierende automatische Drehung aktivieren und konfigurieren möchten, erstellen Sie ein Geräte-Overlay für die config.xml-Datei des Frameworks:
Konfiguriere das standardmäßige Verhalten für die automatische Drehung für verschiedene Gerätepositionen, indem du das Integer-Array [
config_perDeviceStateRotationLockDefaults][7] im 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 Position
HALF_OPENEDbefindet, wird die Einstellung für die PositionOPENEDaktualisiert.
- Wenn Sie die Einstellung für die automatische Drehung für
Konfigurieren Sie Beschreibungen für jede vom Nutzer einstellbare Geräteposition. 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):- Verwende [
RotationPolicy#setRotationLock(...)][5] über die SystemUI oder den Launcher. - Verwenden Sie im Window Manager
DisplayRotation#freezeRotation()oderthawRotation().
- Verwende [
So ändern Sie die Einstellung für die Rotationssperre für einen bestimmten Gerätezustand (ändert
DEVICE_STATE_ROTATION_LOCK):- Verwenden Sie
requestDeviceStateAutoRotateSettingChange(...)entweder überRotationPolicyoder [DeviceStateAutoRotateSettingManager][6].
- 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 des Geräts 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ätehaltung (z. B. gefaltet 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 dafür 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-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 (Haltung
2) ist das automatische Drehen 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][1]: 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)][2]: 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)][3]: Steuern Sie die Benutzeroberfläche auf der Seite mit den einstellungsbasierten Einstellungen für die automatische Bildschirmrotation.PostureDeviceStateConverter: Konvertiert zwischen generischen Geräte-Status-IDs und den Geräte-Posture-IDs, die von dieser Funktion verwendet werden.
Validierung
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.
[1]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManagerImpl.java [2]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/services/core/java/com/android/server/wm/DeviceStateAutoRotateSettingController.java [3]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/src/com/android/settings/display/DeviceStateAutoRotateSettingController.java [4]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/android/provider/Settings.java [5]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/core/java/com/android/internal/view/RotationPolicy.java;bpv=0 [6]: https://cs.android.com/android/platform/superproject/+/android-latest-release:frameworks/base/packages/SettingsLib/DeviceStateRotationLock/src/com/android/settingslib/devicestate/DeviceStateAutoRotateSettingManager.java [7]: https://cs.android.com/android/platform/superproject/+/android-latest-release:packages/apps/Settings/res/values/config.xml;l=674;drc=485b59a37c1cd0af72ca706e0ba1094f4e7fef0e;l=674