目前市面上大多数的手机都是全面屏+虚拟按键,很少有实体按键的手机了,但是不排除有的可能,这不活来了啊
顾不上思考了,开车!分两步走,移除虚拟按键,配置实体菜单键的功能
1.移除虚拟按键
修改项目中的Y:\11\alps\device\xxx\project_name\system.prop # temporary enables NAV bar (soft keys) qemu.hw.mainkeys=0 0是显示 1是移除
但是 如果你发现编译出来的值还是0,那么说明是项目中的prop值没有复写成功,为什么没成功呢?
因为在alps/device/mediatek/system/common/BoardConfig.mk中,mtk默认走的是device/mediatek/system/common/system.prop,而不是我们项目中的,所以需要修改下逻辑,修改成下面走我们项目的文件,这样设置1就可以了
修改前
#TARGET_SYSTEM_PROP += device/mediatek/system/common/system.prop
修改后
ifneq ($(wildcard device/maisui/$(MTK_TARGET_PROJECT)/system.prop),)
TARGET_SYSTEM_PROP += device/maisui/$(MTK_TARGET_PROJECT)/system.prop
else
TARGET_SYSTEM_PROP += device/mediatek/system/common/system.prop
endif
2.配置实体菜单键的功能
虚拟按键和实体键的点击事件都是走的alps\frameworks\base\services\core\java\com\android\server\policy\PhoneWindowManager.java,但是Q开始google添加了全屏手势之后,菜单键的事件被systemUI拦截并处理了,但是实体键的并不会被拦截,所以依然在这里面处理
import android.hardware.input.InputManager;
private long MenukeyDownTime;
private boolean isLongMenuPressed = false;
public static final int FLAG_ORIGINAL_KEY = 0x1000;
public void sendDispatchEvent(int action, int flags, long when, int keycode) {
final int repeatCount = (flags & KeyEvent.FLAG_LONG_PRESS) != 0 ? 1 : 0;
final KeyEvent ev = new KeyEvent(SystemClock.uptimeMillis(), when, action, keycode, repeatCount,
0, KeyCharacterMap.VIRTUAL_KEYBOARD, 0,
flags | KeyEvent.FLAG_FROM_SYSTEM | KeyEvent.FLAG_VIRTUAL_HARD_KEY,
InputDevice.SOURCE_KEYBOARD);
InputManager.getInstance().injectInputEvent(ev,
InputManager.INJECT_INPUT_EVENT_MODE_ASYNC);
}
private Runnable mMenukeyLongPressed = new Runnable(){
public void run(){
isLongMenuPressed = true;
//dispatch original key (menu)
sendDispatchEvent(KeyEvent.ACTION_DOWN, FLAG_ORIGINAL_KEY,SystemClock.uptimeMillis(),KeyEvent.KEYCODE_MENU);
sendDispatchEvent(KeyEvent.ACTION_UP, FLAG_ORIGINAL_KEY,SystemClock.uptimeMillis(),KeyEvent.KEYCODE_MENU);
}
};
private long interceptKeyBeforeDispatchingInner(WindowState win, KeyEvent event,
int policyFlags) {
.......
else if (keyCode == KeyEvent.KEYCODE_MENU) {
// add start
if (!keyguardOn && ((event.getFlags() & FLAG_ORIGINAL_KEY) == 0)) {
if (repeatCount == 0) {
if (down) {
preloadRecentApps();
isLongMenuPressed = false;
MenukeyDownTime = SystemClock.uptimeMillis();
mHandler.removeCallbacks(mMenukeyLongPressed);
mHandler.postDelayed(mMenukeyLongPressed, 1000);
return -1;
} else if (!down) {
mHandler.removeCallbacks(mMenukeyLongPressed);
if (SystemClock.uptimeMillis() - MenukeyDownTime > 1000) {
return -1;
} else {
toggleRecentApps();
return -1;
}
}
} else {
if (down) {
if (isLongMenuPressed) {
isLongMenuPressed = false;
return -1;
} else {
return -1;
}
} else {
return -1;
}
}
}
// add end
}
}
而后长按home键唤醒google语音助手alps/vendor/mediatek/proprietary/packages/apps/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java
@Override
public void start() {
....
// start old BaseStatusBar.start().
mWindowManagerService = WindowManagerGlobal.getWindowManagerService();
//add start
try {
if (!mWindowManagerService.hasNavigationBar(mDisplayId) && mAssistManager != null) {
mAssistManager.onConfigurationChanged(mContext.getResources().getConfiguration());
}
} catch (RemoteException e) {
// Cannot get wms, just return with warning message.
Log.w(TAG, "Cannot get WindowManager.");
}
//add end
mDevicePolicyManager = (DevicePolicyManager) mContext.getSystemService(
Context.DEVICE_POLICY_SERVICE);
mAccessibilityManager = (AccessibilityManager)
mContext.getSystemService(Context.ACCESSIBILITY_SERVICE);
}
这样功能就完成了。