Android - отключение дисплея без включения режима сна / блокировки экрана - включение с помощью сенсорного экрана - PullRequest
28 голосов
/ 02 марта 2012

Я пытался найти способ выключить дисплей и проснуться от прикосновения пользователя к сенсорному экрану.
Устройство находится во встроенной среде, где устройство представляет собой планшет, и пользователь не имеет доступа ни к чему, кроме сенсорного экрана (без кнопок вообще).

Он подключен к источнику питания, поэтому батарея не будет проблемой, но когда я не обнаруживаю никакой активности, я хочу выключить экран, чтобы он не смотрел им в лицо весь день и не уменьшал жизнь подсветка ЖКД.

Я постоянно поддерживаю бодрствование и сам решаю, когда спать.

Проблема в том, что когда я выключаю экран с помощью:

WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 0;
getWindow().setAttributes(params);

Действие приостанавливается и прекращается. И аппарат не реагирует на прикосновения, чтобы разбудить его. Вам нужно нажать кнопку питания. В этот момент появляется «слайд для разблокировки».

Я хочу выключить дисплей, а затем продолжить работу, чтобы я мог обнаружить событие сенсорного экрана и снова включить дисплей.

Я также пытался повернуть дисплей на яркость 0,1, что работает на некоторых устройствах, но устройство, на котором он мне нужен, только «затемняет» дисплей.

Я тоже пробовал это:

// First Remove my FULL wakelock

//then aquire a partial wake lock (which should turn off the display)
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");

wl.acquire();

однако этот метод не отключает дисплей.

Ответы [ 4 ]

7 голосов
/ 16 апреля 2013

Наконец-то разобрался.Надеюсь, поможет.:)

  • Получить экземпляр WindowManager.

    WindowManager windowManager = (WindowManager) Class.forName("android.view.WindowManagerImpl").getMethod("getDefault", new Class[0]).invoke(null, new Object[0]);

  • Создание полноэкранного макета XML (параметры макета)установите значение fill_parent)

  • Установите для своего представления не активируемый, не фокусируемый, не активируемый долго и т. д., чтобы касание передавалось приложению и приложение могло его обнаружить.

    view.setFocusable(false);<br> view.setClickable(false);<br> view.setKeepScreenOn(false);<br> view.setLongClickable(false);<br> view.setFocusableInTouchMode(false);

  • Создайте параметр макета типа android.view.WindowManager.LayoutParams.LayoutParams layoutParams = new LayoutParams();

  • Установка параметров макета, таких как высота, ширина и т. Д.

    layoutParams.height = LayoutParams.FILL_PARENT; 
    layoutParams.width = LayoutParams.FILL_PARENT;
    layoutParams.flags = 280; // You can try LayoutParams.FLAG_FULLSCREEN too
    layoutParams.format = PixelFormat.TRANSLUCENT; // You can try different formats
    layoutParams.windowAnimations = android.R.style.Animation_Toast; // You can use only animations that the system to can access
    layoutParams.type = LayoutParams.TYPE_SYSTEM_OVERLAY;
    layoutParams.gravity = Gravity.BOTTOM;
    layoutParams.x = 0;
    layoutParams.y = 0;
    layoutParams.verticalWeight = 1.0F;
    layoutParams.horizontalWeight = 1.0F;
    layoutParams.verticalMargin = 0.0F;
    layoutParams.horizontalMargin = 0.0F;
    
  • Ключевой шаг: вы можете указать, какой процент яркости вам нужен,view.setBackgroundDrawable(getBackgroundDrawable(i));

    private Drawable getBackgroundDrawable(int i) {
    int j = 255 - (int) Math.round(255D * Math.exp(4D * ((double) i / 100D) - 4D));
    return new ColorDrawable(Color.argb(j, 0, 0, 0));}
    
  • Наконец добавьте представление в созданный ранее WindowManager.

    windowManager.addView(view, layoutParams);

Примечание: Вам необходимо SYSTEM_ALERT_WINDOW разрешение на наложение на экран.

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

Протестировал это, и оно работает.Дайте мне знать, если вы застряли.

1 голос
/ 02 марта 2012

Если у вас есть сервисы, использующие блокировку пробуждения, но если вы делаете это со стороны активности, лучше использовать флаги для получения флага.

        getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); // For keeping screen on
        // You can blur screen or dim screen using following flags
        // FLAG_BLUR_BEHIND -   Blur screen
        // FLAG_DIM_BEHIND - Dim Behind

Вы можете очистить эти флаги, как и наложить другие флаги, чтобы затемнить экран или размыть его.getWindow (). clearFlags (WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);

Надеюсь, это решит вашу проблему.Дополнительно можно изучить другие флаги из http://developer.android.com/reference/android/view/Window.html

Есть еще одна Fyi .. Вызов скрытого API в Android для отключения экрана

0 голосов
/ 20 февраля 2013

Вы можете сделать одну вещь, а именно: Получить частичный Wakelock и выключить экран, используя:

PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 0;
getWindow().setAttributes(params);
0 голосов
/ 09 июня 2012

Я не знаю, поможет ли это вам, но вы могли бы просто использовать блокировку от пробуждения, чтобы ваш экран продолжал отображать изображение, отображающее черное изображение

...