• Android 10-13鼠标右键返回功能适配


    Android 10-13鼠标右键返回功能适配

    一、前言

    Android 原生代码代码中接入usb鼠标,点击右键,一般默认是没有反应的。
    如果要鼠标点击右键设置成返回功能,就要适配系统代码。

    一般Android板子调试初期没有触摸的情况,适配鼠标右键,是对操作使用是带来较大方便的。

    本文介绍不同版本的Android 鼠标右键返回功能适配。

    二、鼠标右键适配修改

    1、Android 10 以及更低版本

    Android 9、10 的修改位置:

    frameworks\native\services\inputflinger\InputReader.cpp

    uint32_t CursorButtonAccumulator::getButtonState() const {
        uint32_t result = 0;
        if (mBtnLeft) {
            result |= AMOTION_EVENT_BUTTON_PRIMARY;
        }
        // Mediatek Android Patch Begin
        // change the mouse key event, right->back, middle-> menu ....
        if (mBtnRight) {
            result |= AMOTION_EVENT_BUTTON_BACK; //右键返回功能
        }
        if (mBtnMiddle) {
            result |= AMOTION_EVENT_BUTTON_MENU; //中间按键菜单功能
        }
        。。。
        return result;
    }
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2、Android11 或者更高版本

    Android 11或者更新的版本的修改位置:

    frameworks\native\services\inputflinger\reader\mapper\accumulator\CursorButtonAccumulator.cpp

    uint32_t CursorButtonAccumulator::getButtonState() const {
        uint32_t result = 0;
        if (mBtnLeft) {
            result |= AMOTION_EVENT_BUTTON_PRIMARY;
        }
        if (mBtnRight) {
            result |= AMOTION_EVENT_BUTTON_BACK;//change by liwenzhi
        }
        if (mBtnMiddle) {
            result |= AMOTION_EVENT_BUTTON_TERTIARY;
        }
    。。
        return result;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    RK Android12 方案的修改:

    uint32_t CursorButtonAccumulator::getButtonState() const {
        uint32_t result = 0;
        if (mBtnLeft) {
            result |= AMOTION_EVENT_BUTTON_PRIMARY;
        }
    
        if (mBtnRight) {
            char targetProduct[PROPERTY_VALUE_MAX] = {0};
            //根据属性值 ro.target.product,决定鼠标右键是否为回退功能。
            property_get("ro.target.product", targetProduct, "");
            if (strcmp(targetProduct, "box") == 0 || strcmp(targetProduct, "atv") == 0 ) { //在括号)前面加一个条件 || strcmp(targetProduct, "tablet") == 0 即可
                result |= AMOTION_EVENT_BUTTON_BACK;
            } else {
                result |= AMOTION_EVENT_BUTTON_SECONDARY;
            }
        }
    ...
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ro.target.product 属性大致是产品类型的意思,基本是固定的不会更改。

    box 盒子,atv 电视机,tablet 平板, phone 手机

    但是很多大屏设备其实是tablet

    在rk方案设备获取ro.target.product属性可以得到验证:

    130|rk3588_s_skg:/ $ getprop ro.target.product
    tablet
    
    
    • 1
    • 2
    • 3

    rk 方案代码,加入上面判断逻辑,鼠标右键就会执行回退功能。

    其实也可以自定义添加一个属性进行判断即可。

    三、总结

    其实不管什么方案或者版本只需 getButtonState 在点击右键的情况返回的键值是 AMOTION_EVENT_BUTTON_BACK 就会执行返回功能。

    1、鼠标右键返回功能修改主要代码

    路径:
    Android11 之前
    frameworks\native\services\inputflinger\InputReader.cpp

    Android11及之后版本
    frameworks\native\services\inputflinger\reader\mapper\accumulator\CursorButtonAccumulator.cpp

    具体修改:

    CursorButtonAccumulator::getButtonState() const {
    
        if (mBtnRight) {
            result |= AMOTION_EVENT_BUTTON_BACK;
        }
        return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2、标右键返回修改代码系统源码搜索

    看上面不管哪个版本的源码都是在 getButtonState 方法中进行鼠标按键适配即可。

    所以全局/framework 遍历CursorButtonAccumulator::getButtonState() 关键字即可找到需要修改的地方。

    可以使用命令:grep -nr “CursorButtonAccumulator::getButtonState()”

    release/framework$ grep -nr "CursorButtonAccumulator::getButtonState()"
    ./native/services/inputflinger/reader/mapper/accumulator/CursorButtonAccumulator.cpp:95:uint32_t CursorButtonAccumulator::getButtonState() const {
    
    
    • 1
    • 2
    • 3

    或者 find . -name “*.cpp” | xargs grep “CursorButtonAccumulator::getButtonState()”

    release/frameworks$ find . -name "*.cpp" | xargs grep "CursorButtonAccumulator::getButtonState()"
    ./native/services/inputflinger/reader/mapper/accumulator/CursorButtonAccumulator.cpp:uint32_t CursorButtonAccumulator::getButtonState() const {
    release/frameworks$ 
    
    
    • 1
    • 2
    • 3
    • 4

    鼠标右键返回功能,基本是调试板初期获取大屏使用也有可能是特定需求,正常手机开发基本用不到。

    3、其他

    屏蔽鼠标右键滑动事件,添加鼠标右键Menu功能:

    https://blog.csdn.net/u010664697/article/details/131071327

    这个估计更少用,需要的可以参考。

  • 相关阅读:
    为win11家庭中文版开启组策编辑器
    宁德时代麒麟电池有着更大的野心
    IDEA快捷键大全
    【读论文】DDcGAN
    编程中的插槽(slot)含义介绍
    面试准备中........
    windows 10 安装k8s环境 Kubernetes
    VScode创建ROS项目 ROS集成开发环境
    物联网中的MQTT协议总结
    【Linux】Linux+Nginx部署项目
  • 原文地址:https://blog.csdn.net/wenzhi20102321/article/details/134538098