ブック型折りたたみ式デバイスでは、テントモードとウェッジモードのサポートを有効にできます。
テントモードとウェッジモードでは、次の図に示すように、デバイスを少し開いた状態で外側の画面を使用できます。

図 1.テントモードとウェッジモードの折りたたみ式デバイスの形状。
テントモードでは、デバイスが半分開いており、2 つの半分がテントのようにデバイスを支えています。ウェッジモードでは、デバイスの右半分が平らな面に置かれ、デバイスを支えています。
Android 16 以降では、デバイスの状態ポリシーとして
BookStyleDeviceStatePolicyを使用することで、この動作をサポートしています。このポリシーは、ブック型の 2 つの画面を備えた折りたたみ式デバイスで機能します。折りたたんだときにヒンジがデバイスの左側に配置されます。
このポリシーでは、次のような特定の条件下で、開いたときに外側の画面が長く表示されます。
- デバイスの右半分がほぼ平らで、デバイスがウェッジモードになっている可能性が高いことを示しています。
- デバイスの向きが逆横向きで、テントモードになっている可能性が高いことを示しています。
- 画面の向きが横向きまたは逆横向きです。
- 画面のウェイクロックを保持しているアプリがあります(画面のタイムアウトを防ぎます)。
このポリシーでは、テントモードやウェッジモードの形状に対して個別のデバイス状態は導入されません。これらの特定の条件下では、より広い範囲のヒンジ角度で閉じた状態が維持されます。
これらのヒューリスティックを完全にサポートするには、デバイスに次のものが必要です。
- デバイスの 2 つの半分の間の角度を報告するヒンジ角度センサー
- デバイスの各半分(左と右)にある加速度センサー
テントモードまたはウェッジモードを設定する
デバイスでテントモードとウェッジモードのサポートを有効にする手順は次のとおりです。
BookStyleDeviceStatePolicyのインスタンスを返すDeviceStatePolicy.Providerの実装を作成します。このインスタンスは、センサー オブジェクトなど、必要な依存関係をすべて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-servicesconfig.xmlファイルで、config_deviceSpecificDeviceStatePolicyProviderをプロバイダのクラス 名に更新します。例:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>