【问题标题】:Calling hidden API in android to turn screen off在android中调用隐藏的API来关闭屏幕
【发布时间】:2009-12-09 17:55:55
【问题描述】:

我正在考虑在我的应用程序中使用隐藏的 API 来关闭屏幕。
https://android.googlesource.com/platform/frameworks/base/+/eclair-release/core/java/android/os/Power.javasetScreenState 可以满足我的要求,但它是一个隐藏的 API。这是否意味着我不应该使用它?我认为它是一个相当稳定的 API。
目前,我将屏幕超时设置为 1 毫秒,然后在屏幕关闭后重置超时。但是,android 忽略了 1 毫秒,而是需要大约 3 秒才能关闭,有时它会完全忽略它并且不会关闭。
有什么建议吗?

【问题讨论】:

  • 您在寻找如何使用它吗?或其他关闭屏幕的方法?即使它是“隐藏的”,您也可以使用反射来调用该方法。但是,您可能会收到一个异常,指出您无权访问该方法。对于某些 API,只有“系统”进程才能使用它们。而且由于您的应用程序不是“系统”进程,因此您不能使用它。
  • 我更喜欢使用公共 API,但我找不到,而且我现在使用的带有屏幕超时的 hack 有时不起作用。我想我对反射很熟悉,但我还没有尝试过。我想我的问题是:如果我找不到替代方案,使用相对稳定的隐藏 API 有多糟糕?
  • @i4ndroid 我怀疑谷歌会添加一个 api 来允许开发者关闭屏幕。但是不要像我一样阻止你向他们请愿。我想看看。我玩弄了 SCREEN_OFF_TIMEOUT,那 5 秒的延迟是一个杀手。我已经放弃了关闭屏幕的功能。我以后可能会重温它。
  • @i4ndroid 我建议不要在锁定屏幕上添加应用程序快捷方式,而是在通知栏中设置一个 FLAG_ONGOING_EVENT 文件夹图标,以显示应用程序快捷方式列表。只是一个想法。我自己也想过做类似的事情,但是我忙于其他项目。附言请不要在发布时将您的应用命名为 Smart Lockscreen,因为我的应用称为 Smart Lock。 youtube.com/watch?v=Y1JdAlNxLYA
  • 这个隐藏的 API 在 Android 2.3 上是否仍然有效?我无法在 Android 2.3.x 上运行,即使 setScreenState 被调用为 false,我在日志中看到它,屏幕没有关闭,代码:pastebin.com/WQKR857z - 或者我的代码有什么问题?跨度>

标签: android


【解决方案1】:

这是我为解决使屏幕休眠的需要所做的工作。您可以在活动窗口中执行此操作。我将它与此自定义锁屏活动的睡眠超时减少到 5 秒配对。您可以在我的项目页面上查看我的所有源代码,但这里是关于关闭屏幕的相关部分,这对我在 droid 上有用。

public void setBright(float value) {
    Window mywindow = getWindow();
    WindowManager.LayoutParams lp = mywindow.getAttributes();
    lp.screenBrightness = value;
    mywindow.setAttributes(lp);
}

//call this task to turn off the screen in a fadeout.


class Task implements Runnable {
    public void run() {                
        if (bright != 0) {
            setBright(bright/100); //start at 10% bright and go to 0 (screen off)
            bright--;
            serviceHandler.postDelayed(myTask, 100L);
        } else {
            setBright((float) 0.0); 
            bright = 10;//put bright back
        }
    }
}

我使用处理程序任务作为该方法的测试,当我在第一次构建中从 onBackPressed 调用它时它起作用了。现在,我只在 onCreate 将活动 setBright 设置为 0.0。这使得即使我的用户通过意外按下音量键唤醒 CPU,屏幕也不会真正打开。当我希望屏幕继续显示时,我将键事件调用 setBright 设置为大于 0 的值(1.0 表示最大亮度)。我很幸运这适用于我的自定义锁屏活动。我发现更改字面亮度系统设置不能像这样工作,并且不会关闭屏幕。

在我的项目中查看我的其他来源 svn http://code.google.com/p/mylockforandroid/source/checkout

您认为要求 android 团队添加对关闭屏幕的支持或定义屏幕是否应通过 Lock mediator 替换唤醒,类似于您如何编写替代 Home Launcher 应用程序有多难?

【讨论】:

  • 我还在测试您是否可以将超时的缩短与同时降低亮度的代码配对。我已经安装了亮度小部件,其中滑块允许我将其一直调到 0,然后屏幕实际上会关闭!如果我能找到某个地方,我会报告。
  • 嘿大卫 - 我叫它 myLock。只是一个简单的切换来抑制锁屏或睡眠超时。我的主版本已经通过设置界面的持续快捷方式运行,但我的想法是制作一个模拟主屏幕的新锁屏。无论如何,我今天学到了一种方法,我可以关闭屏幕或将其关闭,尽管使用自定义锁屏进行 CPU 唤醒。这很巧妙。我只是希望我们能够访问定义屏幕唤醒的规则以及在电源管理器中将其发送到睡眠状态的方法。我要去向安卓团队请愿。看了你的智能锁视频,很好
  • 更新:如果我在dismiss_keyguard窗口启动时收到一个关键事件,我真的不想打开屏幕,这非常适合我保持屏幕关闭的需求。当您想要关闭屏幕时,您似乎可以调用具有相同功能的类似 show_when_locked 活动。我的最新消息来源说明了超时,因此如果用户在“无声”唤醒期间按下电源,它将被处理。我还没有测试过当真正的屏幕关闭广播发出操作系统超时完成的信号时,你如何让 show_when_locked 窗口自行完成。
  • 如何重新打开它?当我调用 setBright(1.0);屏幕仍然关闭!
  • 如何让屏幕在“关闭”/完全变暗时仍能监听触摸事件?
【解决方案2】:

setScreenState...做我想做的事,但是 它是一个隐藏的 API。这是否意味着我 不应该用吗?

是的,这意味着您不应该使用它。在这种情况下,整个类似乎被排除在 SDK 之外。 Please stick to the SDK.

【讨论】:

  • 如果您知道可靠关闭屏幕的方法,请告诉我!
【解决方案3】:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-15
  • 2011-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多