在書本型折疊式裝置上,你可以啟用帳篷和楔形模式的支援功能。
帳篷模式和楔形模式可讓您在裝置稍微開啟時使用外螢幕,如下圖所示:
圖 1. 帳篷和楔形摺疊型態。
在帳篷模式下,裝置會部分開啟,並使用兩半支撐自身,就像帳篷一樣。在「凸起」模式中,裝置會靠在右半邊,平放在表面上。
Android 16 以上版本支援這項行為,方法是使用 BookStyleDeviceStatePolicy
做為裝置狀態政策。這項政策適用於書籍式雙螢幕折疊裝置,折疊時轉軸位於裝置左側。
在特定情況下,這項政策可讓外螢幕在展開時維持開啟狀態更久,例如:
- 裝置右半部大致平坦,表示裝置可能處於楔形模式。
- 裝置方向為反向橫向,表示裝置可能處於帳篷模式。
- 螢幕方向為橫向或反向橫向。
- 有應用程式持有螢幕喚醒鎖定 (防止螢幕逾時)。
這項政策不會為帳篷或楔形姿勢導入個別裝置狀態,而是會在這些特定條件下,將更廣泛的螢幕轉軸角度維持在關閉狀態。
如要完整支援這些啟發式方法,裝置必須:
- 轉軸角度感應器會回報裝置兩半之間的角度
- 裝置左右兩側各有一個加速度計感應器
設定帳篷模式或立架模式
如要在裝置上啟用帳篷模式和立架模式,請按照下列步驟操作:
建立
DeviceStatePolicy.Provider
的實作項目,傳回BookStyleDeviceStatePolicy
的執行個體。執行個體必須向BookStyleDeviceStatePolicy
建構函式提供所有必要依附元件,例如感應器物件。以下範例顯示實作方式:
package com.example; public class MyDevicePolicyProvider implements DeviceStatePolicy.Provider { @Override public DeviceStatePolicy instantiate(@NonNull Context context) { final SensorManager sensorManager = context.getSystemService(SensorManager.class); final Sensor hingeAngleSensor = sensorManager.getDefaultSensor(Sensor.TYPE_HINGE_ANGLE, /* wakeUp= */ true); final List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL); final Sensor hallSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getStringType(), "com.example.hall_effect")); final Sensor rightAccelerometerSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 0")); final Sensor leftAccelerometerSensor = CollectionUtils.find(sensors, (sensor) -> Objects.equals(sensor.getName(), "Accelerometer 1")); // You can pass a non-null value here to disable tent/wedge mode logic, // so the displays switch will always happen at the fixed hinge angle. // This might be useful, for example, when in a retail demo mode where // the hinge angle range of the device is limited. final Integer closeAngleDegrees = null; return new BookStyleDeviceStatePolicy(new FeatureFlagsImpl(), context, hingeAngleSensor, hallSensor, leftAccelerometerSensor, rightAccelerometerSensor, closeAngleDegrees); } }
將政策提供者新增至系統伺服器的類別路徑。首先,請使用在上一個步驟中建立的裝置狀態政策供應商類別,建立程式庫。
以下範例顯示 Soong
Android.bp
藍圖設定:java_library { name: "my-device-services", installable: true, system_ext_specific: true, srcs: [ "src/**/*.java" ], libs: [ "services", ], }
接著,如要將這個程式庫新增至系統伺服器,請修改裝置的 Makefile,加入下列幾行內容:
# Add system service libraries (they contain device-specific policies) PRODUCT_SYSTEM_SERVER_JARS += \ my-device-services PRODUCT_PACKAGES += \ my-device-services
在
config.xml
檔案中,將config_deviceSpecificDeviceStatePolicyProvider
更新為供應商的類別名稱,例如:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>