“帐篷”和“楔形”姿势

在笔记本电脑式可折叠设备上,您可以启用对支架模式和楔形模式的支持。

在立架模式和楔形模式下,您可以在设备略微打开时使用外屏,如下图所示:

立式和楔形可折叠设备状态

图 1. 帐篷和楔形可折叠设备状态。

在影音模式下,设备处于半开状态,使用两个半屏像帐篷一样支撑自身。在楔形模式下,设备靠右半部分支撑,右半部分平放在表面上。

Android 16 及更高版本支持此行为,方法是使用 BookStyleDeviceStatePolicy 作为设备状态政策。此政策适用于采用图书样式的双屏可折叠设备,当设备折叠时,铰链位于设备左侧。

此政策可在某些条件下(例如)延长展开时的外屏开启时间:

  • 设备的右半部分基本平坦,表明设备可能处于楔形模式。
  • 设备方向为反向横向,表明设备可能处于帐篷模式。
  • 屏幕方向为横向或反向横向。
  • 有应用持有屏幕唤醒锁(防止屏幕超时)。

此政策不会为支架模式或楔形模式引入单独的设备状态;在这些特定条件下,它会针对更广泛的铰链角度保持关闭状态。

为了完全支持这些启发式方法,设备需要:

  • 铰链角度传感器,用于报告设备两个半部之间的角度
  • 设备左右两侧的加速度计传感器

配置竖立模式或楔形模式

请按以下步骤在设备上启用竖立模式和楔形模式支持:

  1. 创建 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);
        }
    }
    
  2. 将政策提供程序添加到系统服务器的类路径。首先,创建一个包含您在上一步中创建的设备状态政策提供程序类的库。

    以下示例展示了 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
    
  3. config.xml 文件中,将 config_deviceSpecificDeviceStatePolicyProvider 更新为提供程序的类名称,例如:

    <string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>