29

我一直在尝试找到一种方法来关闭显示器,并从用户触摸触摸屏中唤醒。
该设备处于嵌入式环境中,其中设备是平板电脑,用户无法访问除触摸屏之外的任何东西(根本没有按钮)。

它已连接到电源,因此电池不会有问题,但是当我检测到没有活动时,我想关闭屏幕,这样它就不会整天盯着他们看,也不会减少 LCD 背光的寿命.

我永久保持唤醒锁并决定自己什么时候睡觉。

问题是当我使用以下命令关闭屏幕时:

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

4 回答 4

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.LayoutParamsLayoutParams 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"/>

已经对此进行了测试,并且可以正常工作。如果您遇到困难,请告诉我。

于 2013-04-16T10:01:18.107 回答
1

如果您有服务使用唤醒锁,但如果您是从 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 ..在 android 中调用隐藏的 API 来关闭屏幕

于 2012-03-02T18:38:16.827 回答
0

我不知道这是否对您有帮助,但您可以简单地使用唤醒锁,以便您的屏幕保持打开并显示一个显示黑色图像的图像视图

于 2012-06-09T11:00:32.923 回答
0

您可以做一件事,即获取部分唤醒锁并使用以下命令关闭屏幕:

PowerManager.WakeLock wl = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Your Tag");
wl.acquire();
WindowManager.LayoutParams params = getWindow().getAttributes();
params.screenBrightness = 0;
getWindow().setAttributes(params);
于 2013-02-20T11:28:01.133 回答