1

这有点棘手。

背景:有一个旧的 GalaxyNexus,它的电源按钮不能很好地工作。我必须用力按才能打开/关闭屏幕,这很烦人!

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

1-在PhoneWindowManager的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. 长按home键并滑动关闭屏幕
  2. 按音量 +/- 按钮打开屏幕

但是,如果我禁用锁定屏幕,就会出现异常。如果锁屏设置为NONE,我长按home键并滑动关闭屏幕,打开屏幕后,无论是音量键还是电源键,触摸时UI都没有反应。除非你再按home。似乎搜索面板视图仍然存在并且正在劫持我的触摸事件。

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

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() 方法。这里有什么遗漏吗?是否应该采取任何额外的处理方式?

有没有人可以给我一些提示或灵感?非常感谢!

4

0 回答 0