Android7.1.1 remap滑鼠右鍵為返回鍵
阿新 • • 發佈:2018-12-21
需求:客戶需求當手機連線滑鼠時,可以有開關控制滑鼠右鍵的行為的按鈕,開啟滑鼠右鍵就為返回鍵,關閉保持原來行為。如果只是將右鍵改為返回鍵還是很好做的,找到點選右鍵的事件改一下就行,但是現在還需要控制,就涉及到互動的問題了。先看效果圖。
追蹤程式碼到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; 這樣分發出去的右鍵事件就成
返回鍵了。
第一次寫技術部落格,很多不足還請多多包涵。