Đối với thiết bị có thể gập lại, bạn có thể tối ưu hoá trải nghiệm người dùng bằng cách điều chỉnh hành vi xoay màn hình cho phù hợp với trạng thái vật lý của thiết bị. Ví dụ: bạn có thể đặt màn hình tự động xoay khi thiết bị mở ra ở tư thế giống như máy tính bảng, nhưng khoá ở hướng dọc khi thiết bị gập lại.
Kể từ Android 13, Android có khả năng tuỳ chỉnh chế độ tự động xoay dựa trên trạng thái của thiết bị, chẳng hạn như gập, mở hoặc gập một nửa (chế độ trên mặt bàn).
Hình 1: Chế độ tự động xoay dựa trên trạng thái thiết bị mà người dùng nhìn thấy.
Bật chế độ cài đặt tự động xoay dựa trên trạng thái thiết bị
Để bật và định cấu hình tính năng tự động xoay dựa trên trạng thái thiết bị, hãy tạo một lớp phủ thiết bị cho tệp config.xml của khung, như sau:
Định cấu hình hành vi tự động xoay mặc định cho các tư thế thiết bị khác nhau bằng cách điền vào mảng số nguyên
config_perDeviceStateRotationLockDefaultstrong lớp phủconfig.xmlcủa thiết bị:<!-- 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-keylà một tham chiếu đến tư thế của một thiết bị khác và bạn phải chỉ định khi giá trị cho một tư thế làSettings.Secure.DEVICE_STATE_ROTATION_LOCK_IGNORED. Khi một tư thế được định cấu hình theo cách này, mọi yêu cầu nhận hoặc đặt lựa chọn ưu tiên xoay tự động của tư thế đó sẽ được chuyển hướng đến tư thế dự phòng.Ví dụ: nếu tư thế
HALF_OPENEDquay lại tư thếOPENED:- Đọc chế độ cài đặt tự động xoay cho
HALF_OPENEDsẽ trả về chế độ cài đặt hiện tại choOPENED. - Việc ghi một lựa chọn ưu tiên mới về chế độ tự động xoay trong khi thiết bị đang ở trạng thái
HALF_OPENEDsẽ cập nhật lựa chọn ưu tiên cho tư thếOPENED.
- Đọc chế độ cài đặt tự động xoay cho
Định cấu hình nội dung mô tả cho từng tư thế thiết bị mà người dùng có thể đặt. Điền vào mảng chuỗi
config_settableAutoRotationDeviceStatesDescriptionstrong lớp phủ ứng dụng Cài đặt của thiết bị:<!-- 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>Bạn phải sử dụng đúng API để sửa đổi các chế độ cài đặt này theo phương thức lập trình, thay vì ghi trực tiếp vào trình cung cấp chế độ cài đặt, để ngăn chặn hành vi không nhất quán:
Cách thay đổi trạng thái khoá xoay hiện tại (sửa đổi
ACCELEROMETER_ROTATION):- Từ SystemUI hoặc Trình chạy, hãy sử dụng
RotationPolicy#setRotationLock(...). - Trong Trình quản lý cửa sổ, hãy dùng
DisplayRotation#freezeRotation()hoặcthawRotation().
- Từ SystemUI hoặc Trình chạy, hãy sử dụng
Cách thay đổi lựa chọn ưu tiên khoá hướng xoay cho một trạng thái thiết bị cụ thể (sửa đổi
DEVICE_STATE_ROTATION_LOCK):- Sử dụng
requestDeviceStateAutoRotateSettingChange(...)từRotationPolicyhoặcDeviceStateAutoRotateSettingManager.
- Sử dụng
Thông tin chi tiết về việc triển khai
Các chế độ cài đặt và lớp khoá cốt lõi kiểm soát hành vi tự động xoay cho thiết bị có thể gập lại được mô tả trong các phần sau.
Cài đặt
Hệ thống sử dụng 2 chế độ cài đặt sau để quản lý tính năng tự động xoay:
Settings.System.ACCELEROMETER_ROTATION: Đây là chế độ cài đặt tự động xoay chính. Đối với thiết bị có thể gập lại, giá trị này phản ánh việc tính năng tự động xoay có được bật cho tư thế hiện tại của thiết bị hay không.Settings.Secure.DEVICE_STATE_ROTATION_LOCK: Chế độ cài đặt này lưu trữ lựa chọn ưu tiên tự động xoay của người dùng cho từng tư thế thiết bị (ví dụ: gập hoặc mở). Điều này cho phép hệ thống áp dụng lựa chọn ưu tiên chính xác khi tư thế của thiết bị thay đổi.Chế độ cài đặt này được lưu trữ dưới dạng một chuỗi phân cách bằng dấu hai chấm. Mỗi cặp giá trị đại diện cho một tư thế thiết bị và chế độ xoay tương ứng. Định dạng là:
<device_posture_0>:<rotation_value_0>:<device_posture_1>:<rotation_value_1>...Các giá trị cho chế độ xoay là:
0: Bị bỏ qua (chế độ cài đặt cho tư thế dự phòng được dùng)1: Đã khoá (tắt tính năng tự động xoay)2: Đã mở khoá (bật tính năng tự động xoay)
Ví dụ: chuỗi
"0:2:2:1"có nghĩa là:- Đối với trạng thái gập (tư thế
0), chế độ tự động xoay sẽ được mở khoá (2). - Đối với trạng thái mở (tư thế
2), chế độ tự động xoay sẽ bị khoá (1).
Các lớp chính
Logic quản lý chế độ cài đặt tự động xoay dựa trên trạng thái thiết bị do các lớp sau xử lý:
DeviceStateAutoRotateSettingManagerImpl: Quản lý chế độ cài đặtDEVICE_STATE_ROTATION_LOCK. Nó cung cấp các phương thức để cập nhật chế độ cài đặt, truy xuất giá trị của chế độ cài đặt và đăng ký trình nghe cho các thay đổi.DeviceStateAutoRotateSettingController(Trình quản lý cửa sổ): Đồng bộ hoáACCELEROMETER_ROTATIONvàDEVICE_STATE_ROTATION_LOCK. Khi tư thế của thiết bị thay đổi, thành phần này sẽ cập nhậtACCELEROMETER_ROTATIONdựa trên lựa chọn ưu tiên của người dùng cho trạng thái mới. Thao tác này đảm bảo rằng mọi thay đổi đối vớiACCELEROMETER_ROTATIONđều được lưu lại vàoDEVICE_STATE_ROTATION_LOCKcho tư thế hiện tại của thiết bị và tương tự, các thay đổi đối vớiDEVICE_STATE_ROTATION_LOCKcho tư thế hiện tại đều được phản ánh trongACCELEROMETER_ROTATION.DeviceStateAutoRotateSettingController(Ứng dụng Cài đặt): Kiểm soát giao diện người dùng trên trang cài đặt tự động xoay dựa trên trạng thái thiết bị.PostureDeviceStateConverter: Chuyển đổi giữa các giá trị nhận dạng trạng thái thiết bị chung và giá trị nhận dạng tư thế thiết bị mà tính năng này sử dụng.
Xác nhận kết quả
Vì hành vi của tính năng này phụ thuộc nhiều vào cấu hình của OEM, nên không có các kiểm thử CTS cụ thể cho tính năng này. Bạn phải thực hiện kiểm thử thủ công để xác minh rằng chế độ cài đặt tự động xoay thay đổi như mong đợi khi thiết bị chuyển đổi giữa các trạng thái vật lý mà bạn đã định cấu hình.