Na urządzeniach składanych w formie książki możesz włączyć obsługę trybów namiotu i klina.
Tryby namiotu i klina umożliwiają korzystanie z ekranu zewnętrznego, gdy urządzenie jest lekko otwarte, jak pokazano na poniższym rysunku:
Rysunek 1. Tryb namiotu i tryb klina.
W trybie namiotu urządzenie jest częściowo otwarte i opiera się na obu połówkach, podobnie jak namiot. W trybie klina urządzenie jest oparte na prawej połowie, która leży płasko na powierzchni.
Android 16 i nowsze obsługują to zachowanie, używając BookStyleDeviceStatePolicy
jako zasady stanu urządzenia. Ta zasada działa na urządzeniu składanym z 2 ekranami w formie książki, z zawiasem po lewej stronie urządzenia po złożeniu.
Ta zasada sprawia, że zewnętrzny ekran pozostaje włączony dłużej po rozłożeniu urządzenia w określonych warunkach, np.:
- Prawa połowa urządzenia jest w większości płaska, co oznacza, że urządzenie jest prawdopodobnie w trybie klina.
- Orientacja urządzenia to odwrócony tryb poziomy, co oznacza, że prawdopodobnie jest ono w trybie namiotu.
- Ekran jest w orientacji poziomej lub odwróconej poziomej.
- Aplikacja ma blokadę uśpienia ekranu (zapobiega wyłączeniu ekranu po upływie limitu czasu).
Zasady nie wprowadzają osobnego stanu urządzenia dla pozycji namiotu lub klina. W określonych warunkach zachowują stan zamknięty dla szerszego zakresu kątów zawiasu.
Aby w pełni obsługiwać te heurystyki, urządzenie musi:
- Czujnik kąta zawiasu podający kąt między dwiema połówkami urządzenia
- Akcelerometr na każdej (lewej i prawej) połowie urządzenia
Konfigurowanie trybu namiotu lub klina
Aby włączyć obsługę trybu namiotu i podstawki na urządzeniu, wykonaj te czynności:
Utwórz implementację
DeviceStatePolicy.Provider
, która zwraca instancjęBookStyleDeviceStatePolicy
. Instancja musi udostępniać wszystkie niezbędne zależności, takie jak obiekty czujników, do konstruktoraBookStyleDeviceStatePolicy
.Poniżej znajdziesz przykładową implementację:
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); } }
Dodaj dostawcę zasad do ścieżki klas serwera systemowego. Zacznij od utworzenia biblioteki z klasą dostawcy zasad stanu urządzenia utworzoną w poprzednim kroku.
Poniższy przykład przedstawia konfigurację Soong
Android.bp
:java_library { name: "my-device-services", installable: true, system_ext_specific: true, srcs: [ "src/**/*.java" ], libs: [ "services", ], }
Aby dodać tę bibliotekę do serwera systemowego, zmodyfikuj plik makefile urządzenia, dodając te wiersze:
# Add system service libraries (they contain device-specific policies) PRODUCT_SYSTEM_SERVER_JARS += \ my-device-services PRODUCT_PACKAGES += \ my-device-services
Zaktualizuj
config_deviceSpecificDeviceStatePolicyProvider
, aby w plikuconfig.xml
podać nazwę klasy dostawcy, na przykład:<string translatable="false" name="config_deviceSpecificDeviceStatePolicyProvider">com.example.MyDevicePolicyProvider</string>