Android7.1.1 remap鼠标右键为返回键

需求:客户需求当手机连接鼠标时,可以有开关控制鼠标右键的行为的按钮,打开鼠标右键就为返回键,关闭保持原来行为。如果只是将右键改为返回键还是很好做的,找到点击右键的事件改一下就行,但是现在还需要控制,就涉及到交互的问题了。先看效果图。

Android7.1.1 remap鼠标右键为返回键_第1张图片
追踪代码到InputReader.cpp文件,位置frameworks/native/services/inputflinger/InputReader.cpp。熟悉android事件输入的朋友可能对该文件很了解,InputReader主要功能是处理EventHub传过来的事件,然后加工,再分发给各个InputDispatcher。其中对鼠标事件处理的方法如下:

uint32_t CursorButtonAccumulator::getButtonState() const {
    uint32_t result = 0;
    if (mBtnLeft) {
        result |= AMOTION_EVENT_BUTTON_PRIMARY;
    }
    if (mBtnRight) {//右键事件
        result |= AMOTION_EVENT_BUTTON_SECONDARY;
    }
    if (mBtnMiddle) {
        result |= AMOTION_EVENT_BUTTON_TERTIARY;
    }
    if (mBtnBack || mBtnSide) {
        result |= AMOTION_EVENT_BUTTON_BACK;
    }
    if (mBtnForward || mBtnExtra) {
        result |= AMOTION_EVENT_BUTTON_FORWARD;
    }
    return result;
}

通过加log找到右键事件处理的地方,需要做的就是将其改为返回键,可是这段代码是在native层,如何被上层的apk控制呢,也需你可以想到jni的方式,不过感觉太麻烦了。两边需要通信,为何不找一个媒介做一个配置属性,上层设置这个属性,native层读取。property就是一个很好的媒介,两边都可以操纵。动手加起来。
首先在system.prop中添加一个prop属性:persist.sys.mouse.right.back=false
上层按钮修改其值,按钮是一个preference:

    @Override
    public boolean onPreferenceChange(Preference preference, Object newValue) {
        if(preference.getKey().equals(KEY_SET_MOUSE)){
            String newStrValue = (boolean)newValue ? "true" : "false";
            SystemProperties.set("persist.sys.mouse.right.back", newStrValue);
        }
    }

接下来修改InputReader.cpp代码,在右键事件地方添加代码:

uint32_t CursorButtonAccumulator::getButtonState() const {
    uint32_t result = 0;
    if (mBtnLeft) {
        result |= AMOTION_EVENT_BUTTON_PRIMARY;
    }
    if (mBtnRight) {
        char model[10];
        __system_property_get("ro.product.model", model);
            char remapback[10];
            __system_property_get("persist.sys.mouse.right.back", remapback);
            if(strcmp(remapback,"true") == 0){
                 result |= AMOTION_EVENT_BUTTON_BACK;
            }else{
                 result |= AMOTION_EVENT_BUTTON_SECONDARY;
            }
        }
    }
    if (mBtnMiddle) {
        result |= AMOTION_EVENT_BUTTON_TERTIARY;
    }
    if (mBtnBack || mBtnSide) {
        result |= AMOTION_EVENT_BUTTON_BACK;
    }
    if (mBtnForward || mBtnExtra) {
        result |= AMOTION_EVENT_BUTTON_FORWARD;
    }
    return result;
}

C++中要使用prop要记得先添加 #include
主要就是改result |= AMOTION_EVENT_BUTTON_BACK; 这样分发出去的右键事件就成
返回键了。
第一次写技术博客,很多不足还请多多包涵。

你可能感兴趣的:(android)