Mr.Alright---MTK平台Android Q去除虚拟按键并修改实体菜单键为换起最近任务

目前市面上大多数的手机都是全面屏+虚拟按键,很少有实体按键的手机了,但是不排除有的可能,这不活来了啊

顾不上思考了,开车!分两步走,移除虚拟按键,配置实体菜单键的功能

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);
}

这样功能就完成了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值