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

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

Seite mit Einstellungen für die automatische Drehung basierend auf dem Gerätestatus

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:

  1. Konfiguriere das Standardverhalten für die automatische Drehung für verschiedene Gerätepositionen, indem du das Integer-Array config_perDeviceStateRotationLockDefaults im Geräte-Overlay config.xml festlegst:

    <!-- 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 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 die OPENED-Haltung zurückfällt:

    • Wenn Sie die Einstellung für die automatische Drehung für HALF_OPENED lesen, wird die aktuelle Einstellung für OPENED zurü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 die OPENED-Position aktualisiert.
  2. Beschreibungen für jede vom Nutzer einstellbare Geräteposition konfigurieren. Füllen Sie das String-Array config_settableAutoRotationDeviceStatesDescriptions im 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>
    
  3. 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):

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

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 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äteausrichtung ändert, wird ACCELEROMETER_ROTATION entsprechend der Einstellung des Nutzers für den neuen Status aktualisiert. So wird sichergestellt, dass alle Änderungen an ACCELEROMETER_ROTATION für die aktuelle Geräteausrichtung in DEVICE_STATE_ROTATION_LOCK gespeichert werden und Änderungen an DEVICE_STATE_ROTATION_LOCK für die aktuelle Ausrichtung in ACCELEROMETER_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.