按键相关
1、长按电源键关机、重启文案修改
ShutdownThread.java --->showShutdownDialog()方法中红色方框里修改
资源文件在:framework/base/core/res/res/valuexxx/strings.xml
在framework/base/core/res/res/values/symbols.xml声明自己的变量,如下:
<java-symbol type="string" name="power_reboot "/>
或者
运行命令:make framework 2>&1 | sed -n -f MakeJavaSymbols.sed | sort -u
使用这个命令将会列出所有新增的私有资源,将它们拷贝到symbols.xml中即可。
2、音量+/-长按功能,禁麦健区分单击和双击修改 禁键单击和双击:Framework/base/services/core/java/com/android/server/policy/PhoneWindowManager.java的interceptKeyBeforeQueueing方法中修改(代码仅供参考) private long volumeDownTime = 0L; private long volumeUpTime = 0L; private long headSetHookDownTime = 0L; private int headSetHookDownNum = 0; private long headSetHookIntervalTime = 0L; private HeadSetHookRunnable mHeadSetHookRunnable; private class HeadSetHookRunnable implements Runnable { private int keyCode = -1; public HeadSetHookRunnable(int keyCode) { this.keyCode = keyCode; } @Override public void run() { Intent intent = new Intent(ACTION_KEYCODE); intent.putExtra("keyCode", keyCode); intent.putExtra("headSetHookType", "HEADSETHOOK_FIRST_CLICK"); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); // 单击 headSetHookDownNum = 0; headSetHookIntervalTime = 0; mHeadSetHookRunnable = null; } };
case KeyEvent.KEYCODE_VOLUME_MUTE:{
result &= ~ACTION_PASS_TO_USER;
if (down) {
headSetHookDownTime = SystemClock.uptimeMillis();
} else {
if (SystemClock.uptimeMillis() - headSetHookDownTime >= ViewConfiguration.get(mContext).getDeviceGlobalActionKeyTimeout()) {
// long press
headSetHookDownNum = 0;
headSetHookIntervalTime = 0;
mHeadSetHookRunnable = null;
} else {
if (mHeadSetHookRunnable == null) {
mHeadSetHookRunnable = new HeadSetHookRunnable(keyCode);
}
if (headSetHookDownNum == 1
&& SystemClock.uptimeMillis() - headSetHookIntervalTime < 400) {
// double click
Intent intent = new Intent(ACTION_KEYCODE);
intent.putExtra("keyCode", keyCode);
intent.putExtra("headSetHookType", "HEADSETHOOK_DOUBLE_CLICK");
mContext.sendBroadcastAsUser(intent, UserHandle.ALL);
mHandler.removeCallbacks(mHeadSetHookRunnable);
mHeadSetHookRunnable = null;
headSetHookDownNum = 0;
headSetHookIntervalTime = 0;
} else {
mHandler.removeCallbacks(mHeadSetHookRunnable);
mHandler.postDelayed(mHeadSetHookRunnable, 400);
headSetHookDownNum++;
}
}
headSetHookIntervalTime = SystemClock.uptimeMillis();
}
break;
}
音量+/-长按:Framework/base/services/core/java/com/android/server/policy/PhoneWindowManager.java的interceptKeyBeforeDispatching方法中修改(代码仅供参考) } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) { if (mUseTvRouting || mHandleVolumeKeysInWM) { // On TVs or when the configuration is enabled, volume keys never // go to the foreground app. dispatchDirectAudioEvent(event, false); return -1; } if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) { if (down) { if (SystemClock.uptimeMillis() - volumeDownTime >= 50) { Intent intent = new Intent(ACTION_KEYCODE); intent.putExtra("keyCode", keyCode); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); volumeDownTime = SystemClock.uptimeMillis(); } } } else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) { if (down) { if (SystemClock.uptimeMillis() - volumeUpTime >= 50) { Intent intent = new Intent(ACTION_KEYCODE); intent.putExtra("keyCode", keyCode); mContext.sendBroadcastAsUser(intent, UserHandle.ALL); volumeUpTime = SystemClock.uptimeMillis(); } } } // If the device is in Vr mode, drop the volume keys and don't // forward it to the application/dispatch the audio event. if (mPersistentVrModeEnabled) { return -1; } } else if (keyCode == KeyEvent.KEYCODE_TAB && event.isMetaPressed())
注意:音量+/-长按修改,需要在interceptKeyBeforeQueueing中的
case KeyEvent.KEYCODE_VOLUME_DOWN:
break; case KeyEvent.KEYCODE_VOLUME_UP:
break;
把result &= ~ACTION_PASS_TO_USER;去掉
——————————————————————————————————————————-