Einstellung für die automatische Drehung basierend auf dem Gerätestatus

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).

Seite mit Einstellungen für das automatische Drehen des Bildschirms basierend auf dem Gerätestatus

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:

  1. Konfigurieren Sie das Standardverhalten für das automatische Drehen für verschiedene Gerätepositionen, indem Sie das config_perDeviceStateRotationLockDefaults Integer-Array in der Überlagerung config.xml Ihres 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-key ist ein Verweis auf eine andere Geräteposition. Sie müssen angeben, wann der Wert für eine Position Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED ist. 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_OPENED Position beispielsweise auf die OPENED Position zurückgreift:

    • Wenn Sie die Einstellung für das automatische Drehen für HALF_OPENED lesen, wird die aktuelle Einstellung für OPENED zurückgegeben.
    • Wenn Sie eine neue Einstellung für das automatische Drehen festlegen, während das Gerät HALF_OPENED wird die Einstellung für die Position OPENED aktualisiert.
  2. Konfigurieren Sie Beschreibungen für jede vom Nutzer festlegbare Geräteposition. Füllen Sie das String-Array config_settableAutoRotationDeviceStatesDescriptions in 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>
    
  3. 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):

    • So ändern Sie die Einstellung für die Rotationssperre für einen bestimmten Gerätezustand (ändert DEVICE_STATE_ROTATION_LOCK):

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 Einstellung DEVICE_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): Synchronisiert ACCELEROMETER_ROTATION und DEVICE_STATE_ROTATION_LOCK. Wenn sich die Geräteposition ändert, wird ACCELEROMETER_ROTATION basierend auf der Einstellung des Nutzers für den neuen Zustand aktualisiert. Alle Änderungen an ACCELEROMETER_ROTATION werden in DEVICE_STATE_ROTATION_LOCK für die aktuelle Geräteposition gespeichert. Änderungen an DEVICE_STATE_ROTATION_LOCK für die aktuelle Position werden auf ähnliche Weise in ACCELEROMETER_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.