对于可折叠设备,可以通过根据设备的物理状态调整屏幕旋转行为来优化用户体验。例如,您可以设置当设备以平板电脑姿势展开时屏幕自动旋转,但当设备折叠时锁定为竖屏。
从 Android 13 开始,Android 能够根据设备状态(例如折叠、展开或半折叠 [桌面模式])自定义自动旋转设置。
图 1:用户看到的基于设备状态的自动旋转设置。
启用基于设备状态的自动旋转设置
如需启用和配置基于设备状态的自动旋转,请为框架的 config.xml 文件创建设备叠加层,如下所示:
通过在设备的叠加层
config.xml中填充config_perDeviceStateRotationLockDefaults整数数组,为不同的设备姿态配置默认的自动旋转行为:<!-- 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是对其他设备姿态的引用,您必须在姿态的值为Settings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED时指定该值。如果姿势按此方式配置,则获取或设置其自动旋转偏好的任何请求都会重定向到回退姿势。例如,如果
HALF_OPENED姿势回退到OPENED姿势:- 读取
HALF_OPENED的自动旋转设置会返回OPENED的当前设置。 - 在设备处于
HALF_OPENED状态时写入新的自动旋转偏好设置会更新OPENED姿势的偏好设置。
- 读取
为每个用户可设置的设备姿态配置说明。在设备的“设置”应用叠加层中填充
config_settableAutoRotationDeviceStatesDescriptions字符串数组:<!-- 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>您必须使用正确的 API 以编程方式修改这些设置,而不是直接写入设置提供程序,以防止出现不一致的行为:
如需更改当前旋转锁定状态(修改
ACCELEROMETER_ROTATION),请执行以下操作:- 从 SystemUI 或启动器中使用
RotationPolicy#setRotationLock(...)。 - 在窗口管理器中,使用
DisplayRotation#freezeRotation()或thawRotation()。
- 从 SystemUI 或启动器中使用
如需更改特定设备状态的旋转锁定偏好设置(修改
DEVICE_STATE_ROTATION_LOCK),请执行以下操作:- 使用
RotationPolicy或DeviceStateAutoRotateSettingManager中的requestDeviceStateAutoRotateSettingChange(...)。
- 使用
实现细节
以下部分介绍了控制可折叠设备的自动旋转行为的设置和核心键类。
设置
系统使用以下两项设置来管理自动旋转:
Settings.System.ACCELEROMETER_ROTATION:这是主要的自动旋转设置。对于可折叠设备,其值反映了设备当前设备姿势是否启用了自动旋转。Settings.Secure.DEVICE_STATE_ROTATION_LOCK:此设置用于存储用户针对每种设备姿态(例如折叠或展开)的自动旋转偏好设置。这样一来,当设备姿态发生变化时,系统便可以应用正确的偏好设置。相应设置以英文冒号分隔的字符串形式存储。每对值都表示一种设备姿态及其对应的旋转设置。格式为:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...旋转的值如下:
0:忽略(使用后备姿势的设置)1:锁定(自动旋转已关闭)2:已解锁(自动旋转处于开启状态)
例如,字符串
"0:2:2:1"表示:- 对于折叠状态(姿势
0),自动旋转处于解锁状态 (2)。 - 对于展开状态(姿势
2),自动旋转处于锁定状态 (1)。
关键类
用于管理基于设备状态的自动旋转设置的逻辑由以下类处理:
DeviceStateAutoRotateSettingManagerImpl:管理DEVICE_STATE_ROTATION_LOCK设置。它提供了一些方法来更新设置、检索其值以及注册监听器以监听更改。DeviceStateAutoRotateSettingController(窗口管理器):同步ACCELEROMETER_ROTATION和DEVICE_STATE_ROTATION_LOCK。当设备姿态发生变化时,它会根据用户对新状态的偏好设置来更新ACCELEROMETER_ROTATION。它可确保对ACCELEROMETER_ROTATION的任何更改都会保存回DEVICE_STATE_ROTATION_LOCK,以用于当前设备折叠状态;同样,对当前折叠状态的DEVICE_STATE_ROTATION_LOCK所做的更改也会反映在ACCELEROMETER_ROTATION中。DeviceStateAutoRotateSettingController(“设置”应用):控制基于设备状态的自动旋转设置页面上的界面。PostureDeviceStateConverter:在通用设备状态标识符与此功能使用的设备姿态标识符之间进行转换。
验证
由于此功能在很大程度上取决于 OEM 的配置,因此没有专门针对此功能的 CTS 测试。您必须执行手动测试,以验证当设备在您配置的不同物理状态之间转换时,自动旋转设置是否按预期发生变化。