Android - 关闭屏幕的正确方法是什么

时间:2013-08-28 14:41:56

标签: android android-source keyguard powermanager

这有点棘手。

背景:有一个旧的GalaxyNexus,其电源按钮功能不正常。我必须努力打开/关闭屏幕,这非常烦人!

解决方案:我已经下载了最新的AOSP并构建了自己的固件映像。我修改了两个地方来处理这个问题。

1-在P​​honeWindowManager的interceptKeyBeforeQueueing()函数中,我添加了以下处理代码:

if(keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
    if(event.getAction() == KeyEvent.ACTION_UP && !mPowerManager.isScreenOn()) {
        return ACTION_WAKE_UP;
    }
}

2-在状态栏源代码中,我在长按主页按钮时修改了回叫。我改变它从触发谷歌助手关闭屏幕(道歉到谷歌)。在SearchPanelView中的onTrigger()函数中,我修改了如下代码:

//startAssistActivity();
vibrate();
PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
if(pm.isScreenOn()) {
    pm.goToSleep(SystemClock.uptimeMillis());
}

我已经注释了启动辅助活动的原始代码,并添加了关闭屏幕的代码。

结果:看起来工作正常,现在我可以

  1. 长按主页按钮并滑动以关闭屏幕
  2. 按音量+/-按钮打开屏幕
  3. 但是,如果禁用锁定屏幕,则会出现异常。如果屏幕锁定设置为NONE并且我长按主页按钮并滑动以关闭屏幕,在我打开屏幕后,无论是通过音量键还是电源键,当您触摸它时UI都没有反应。除非你再次按回家。似乎搜索面板视图仍在那里并且正在劫持我的触摸事件。

    我还尝试修改状态栏中的代码,如下所示:

    mBar.animateCollapsePanels(CommandQueue.FLAG_EXCLUDE_SEARCH_PANEL);
    Slog.i(TAG, "onTrigger: post message to turn off screen after 100ms.");
    v.postDelayed(new Runnable() {
        @Override
        public void run() {
            PowerManager pm = (PowerManager)mContext.getSystemService(Context.POWER_SERVICE);
            if(pm.isScreenOn()) {
                pm.goToSleep(SystemClock.uptimeMillis());
            }
        }
    }, 100);
    

    但问题仍然存在。此问题仅发生在使用“长按主页并向上滑动”操作关闭屏幕的情况下。这意味着使用PowerManager.gotoSleep()方法。这里有什么遗漏的吗?是否应该进行额外处理?

    有人能给我一些暗示或灵感吗?非常感谢!

0 个答案:

没有答案