Pozycje namiotu i klina

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:

Tryby składania namiotu i klina

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:

  1. 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 konstruktora BookStyleDeviceStatePolicy.

    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);
        }
    }
    
  2. 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
    
  3. Zaktualizuj config_deviceSpecificDeviceStatePolicyProvider, aby w pliku config.xml podać nazwę klasy dostawcy, na przykład:

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