我一直试图找到一种关闭显示器的方法,并从触摸触摸屏的用户中醒来 该设备处于嵌入式环境中,其中设备是平板电脑,并且用户除了触摸屏之外不能访问任何东西(根本没有按钮)。
它连接到电源,所以电池不会出现问题,但是当我发现没有活动时,我想要关闭屏幕,这样它就不会整天盯着它们,也不会减少寿命液晶背光。
我永久保留一个唤醒锁,并决定何时自己睡觉。
问题在于,当我使用以下方式关闭屏幕时
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();
但是此方法不会关闭显示。
答案 0 :(得分:7)
终于明白了。希望能帮助到你。 :)
获取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"/>
测试了这个并且它有效。如果你遇到困难,请告诉我。
答案 1 :(得分:1)
如果你有服务使用唤醒锁定,但如果你从活动方面这样做,最好使用标志来获取标志。
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
答案 2 :(得分:0)
我不知道这对你有帮助,但你可以简单地使用唤醒锁,这样你的scren就会继续显示并显示一个显示黑色图像的imageview
答案 3 :(得分:0)
你可以做一件事是获取Partial 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);