Android – 在不触发睡眠/locking屏幕的情况下closures显示屏 – 使用触摸屏开启

我一直试图find一种方法来closures显示器,并从用户触摸触摸屏醒来。
该设备处于embedded式环境中,该设备是平板电脑,用户除了触摸屏之外不能访问任何内容(根本没有button)。

它连接到电源,所以电池不会是一个问题,但是当我没有发现任何活动,我想closures屏幕,所以它不是整天在脸上凝视,不会减less液晶背光。

我永远保持一个唤醒锁,并决定什么时候自己睡觉。

问题是,当我closures屏幕使用:

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

活动暂停并停止。 而且这个单位不会响应一个触摸来唤醒它。 您需要按下电源button。 此时“滑动解锁”显示出来。

我想closures显示器,然后保持运行,这样我就可以检测触摸屏事件并重新打开显示器。

我也尝试将显示器的亮度设置为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(); 

但是这种方法不会closures显示器。

Solutions Collecting From Web of "Android – 在不触发睡眠/locking屏幕的情况下closures显示屏 – 使用触摸屏开启"

终于搞明白了。 希望能帮助到你。 🙂

  • 获取WindowManager的一个实例。

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

  • 创build一个全屏布局xml(布局参数设置为fill_parent

  • 将您的视图设置为不可点击,不可聚焦,不可长时间点击等,以便将触摸传递给您的应用程序,并且应用程序可以检测到它。

    view.setFocusable(false);
    view.setClickable(false);
    view.setKeepScreenOn(false);
    view.setLongClickable(false);
    view.setFocusableInTouchMode(false);

  • 创build一个types为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));} 
  • 最后将视图添加到您之前创build的windowManager。

    windowManager.addView(view, layoutParams);

注意:您需要SYSTEM_ALERT_WINDOW权限才能在屏幕上放置叠加层。

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

已经testing过,它的工作原理。 让我知道如果你卡住了。

如果你有服务使用唤醒锁,但如果你从活动侧做它更好的想法使用标志获得国旗。

  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的其他标&#x5FD7;

还有一个Fyi .. 在Android中调用隐藏的API来closures屏幕

我不知道这是否有助于你,但你可以简单地使用唤醒锁,让你的scren保持不变,并显示一个显示黑色图像的imageview

你可以做一件事是获取部分唤醒锁,并使用屏幕closures:

 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

那么,有一段时间,有什么进展?

如果你仍然在这上面:为什么不把螺丝起子button和触摸屏,也许绑定唤醒陀螺仪?

我希望至less对于带有button的手机使用这样的东西,并将唤醒卸载到音量控制键或陀螺仪上。