Android - выключите дисплей без запуска экрана сна/блокировки - включите сенсорный экран
Я пытаюсь найти способ выключить дисплей и просыпаться от пользователя, касающегося сенсорного экрана.
Устройство находится во встроенной среде, где устройство представляет собой планшет, и пользователь не имеет доступа ни к чему, кроме сенсорного экрана (без кнопок вообще).
Он подключен к источнику питания, поэтому батарея не будет проблемой, но когда я не обнаруживаю никакой активности, я хочу отключить экран, чтобы он не смотрел на них в лицо весь день и не уменьшал жизнь ЖК-подсветка.
Я постоянно держу вакелон и решаю, когда спать.
Проблема заключается в том, что когда я выключаю экран, используя:
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();
однако этот метод не отключает отображение.
Ответы
Ответ 1
Наконец понял это. Надеюсь, поможет.:)
-
Получить экземпляр 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);
view.setClickable(false);
view.setKeepScreenOn(false);
view.setLongClickable(false);
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"/>
Тестировали это, и оно работает. Дайте мне знать, если вы застряли.
Ответ 2
Если у вас есть службы, используйте блокировку бодрствования, но если вы делаете это со стороны Activity, то лучше использовать флаги для получения флага.
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, чтобы отключить экран
Ответ 3
Я не знаю, поможет ли это вам, но вы можете просто использовать блокировку слежения, чтобы ваш scren продолжал и отображал изображение, которое отображает черное изображение.
Ответ 4
Вы можете сделать одну вещь, которая является приобретением Partial Wakelock, и выключить Screen, используя:
PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 0;
getWindow().setAttributes(params);
Ответ 5
@NebulaSleuth
Значит, это был какой-то прогресс?
Если вы все еще на нем: почему бы не нажимать кнопки и сенсорные экраны, возможно, связать пробуждение с гироскопом?
Я надеялся использовать что-то вроде этого, по крайней мере, для телефонов с кнопками и разгрузить пробуждение либо клавишами регулировки громкости, либо гироскопом...