帳篷和凸起模式

在書本型折疊式裝置上,你可以啟用帳篷和楔形模式的支援功能。

帳篷模式和楔形模式可讓您在裝置稍微開啟時使用外螢幕,如下圖所示:

帳篷和凸起摺疊型態

圖 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>