1. 程式人生 > >Android7.1.1 remap滑鼠右鍵為返回鍵

Android7.1.1 remap滑鼠右鍵為返回鍵

需求:客戶需求當手機連線滑鼠時,可以有開關控制滑鼠右鍵的行為的按鈕,開啟滑鼠右鍵就為返回鍵,關閉保持原來行為。如果只是將右鍵改為返回鍵還是很好做的,找到點選右鍵的事件改一下就行,但是現在還需要控制,就涉及到互動的問題了。先看效果圖。

按鈕
追蹤程式碼到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 <sys/system_properties.h>
主要就是改result |= AMOTION_EVENT_BUTTON_BACK; 這樣分發出去的右鍵事件就成
返回鍵了。
第一次寫技術部落格,很多不足還請多多包涵。