这有点棘手。
背景:有一个旧的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());
}
我已经注释了启动辅助活动的原始代码,并添加了关闭屏幕的代码。
结果:看起来工作正常,现在我可以
但是,如果禁用锁定屏幕,则会出现异常。如果屏幕锁定设置为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()方法。这里有什么遗漏的吗?是否应该进行额外处理?
有人能给我一些暗示或灵感吗?非常感谢!