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();
Однако этот метод не отключает дисплей.
5 ответов
Наконец-то разобрался. Надеюсь, поможет.:)
Получить экземпляр 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"/>
Протестировал это, и это работает. Дайте мне знать, если вы застряли.
Если у вас есть сервисы, использующие блокировку пробуждения, но если вы делаете это со стороны активности, лучше использовать флаги для получения флага.
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, чтобы выключить экран
Вы можете сделать одну вещь, а именно: получить частичный 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);
@NebulaSleuth
Итак, прошло какое-то время, какой-нибудь прогресс?
Если вы все еще на нем: почему бы не прикрутить кнопки и сенсорные экраны, возможно, привязать пробуждение к гироскопу?
Я надеялся использовать что-то подобное по крайней мере для телефонов с кнопками и разгрузить пробуждение либо клавишами регулировки громкости, либо гироскопом...
Я не знаю, поможет ли это вам, но вы могли бы просто использовать блокировку, чтобы ваш экран продолжал отображать изображение, отображающее черное изображение.