安卓设备手柄无法映射线性扳机的解决思路(1)
[轉(zhuǎn)載需注明作者及出處]
 此方案需要安卓設(shè)備已經(jīng)獲取Root權(quán)限,并且本文只提供一個(gè)解決思路,文中所給代碼并不能直接用在自己的設(shè)備上,請(qǐng)自行修改以適配自己的設(shè)備。
 測(cè)試設(shè)備:小新pad pro 2021,安卓11
一、前言
 眾所周知移動(dòng)端原生支持手柄的游戲?qū)嵲诓欢?#xff0c;要用手柄暢玩流行手游基本上需要映射,還有模擬器使用手柄作為輸入設(shè)備也需要通過鍵位映射。
 博主最近買了很多手柄用在安卓設(shè)備上,發(fā)現(xiàn)其中有一些手柄的線性扳機(jī)無法使用映射app映射成屏幕點(diǎn)擊,使用天際線模擬器時(shí)也無法成功映射成L2R2鍵,我研究了一個(gè)晚上解決了這個(gè)問題,并為手柄功能拓展提出了一些思路,故寫此文為遇到同樣問題的朋友提供參考。
 理論上適用于所有手柄,已Root的安卓設(shè)備和Linux設(shè)備。
測(cè)試所用手柄:
 原裝DualShock 4(PS4配柄):USB連接和藍(lán)牙連接,線性扳機(jī)
 國(guó)產(chǎn)DualShock 4:藍(lán)牙連接,線性扳機(jī)
 1UP GC1(樂升盒子配柄):藍(lán)牙連接,線性扳機(jī)
 Obox OC1(蝸牛主機(jī)配柄):藍(lán)牙連接,線性扳機(jī)
 Fuze手柄(戰(zhàn)斧F1主機(jī)配柄):藍(lán)牙連接,線性扳機(jī)
 國(guó)產(chǎn)xbox360手柄有線:USB連接,線性扳機(jī)
 飛智八爪魚一代:藍(lán)牙連接,USB2.4G接收器,線性扳機(jī)
 飛智Wee一代:藍(lán)牙連接,無線性扳機(jī)
映射使用的APP(線性扳機(jī)無法映射的問題應(yīng)該與APP無關(guān)):
 ZUI外設(shè)模式
 北通游戲廳
 Mantis Gamepad
 Shanwan Gamepad
二、問題分析
 博主測(cè)試不同手柄線性扳機(jī)輸入的過程中,發(fā)現(xiàn)了三種不同的輸入模式:
 1、只有GAS和BRAKE輸入。
2、同時(shí)有GAS/RTRIGGER 和 BRAKE/LTRIGGER的輸入信號(hào)并且綁定在一起。
 3、不僅同時(shí)有GAS/RTRIGGER 和 BRAKE/LTRIGGER的輸入信號(hào)(ABS事件),并且在線性扳機(jī)的值達(dá)到某個(gè)閾值時(shí)會(huì)觸發(fā)輸入BUTTON_L2或BUTTON_R2(KEY事件),這種情況是手柄內(nèi)部程序做了補(bǔ)償,可能是為了兼容其他平臺(tái)(ds4和飛智八爪魚就是這種輸入模式)。
第一種情況通常表現(xiàn)為在軟件中設(shè)置鍵位映射時(shí)識(shí)別不到扳機(jī)鍵;
 第二種情況通常表現(xiàn)為在軟件中設(shè)置鍵位映射可以將扳機(jī)鍵識(shí)別為L(zhǎng)2/R2,但是在游戲中無法觸發(fā)映射;
 第三種情況則可以正常識(shí)別按鍵也可以正常觸發(fā)。
因?yàn)榫€性扳機(jī)的輸入事件與搖桿同為ABS事件,輸入的是模擬量;而普通按鍵輸入的是KEY事件,只有0和1兩種輸入;我們點(diǎn)擊屏幕的行為跟KEY事件是同類型的,如果手柄自身沒有做BUTTON_L2/R2輸入補(bǔ)償,大部分映射軟件不能把模擬輸入映射為按鍵輸入,因此出現(xiàn)了線性扳機(jī)無法映射的情況。
 而博主使用飛智Wee手柄沒有線性扳機(jī),扳機(jī)鍵跟普通按鍵一樣輸入KEY事件,就不存在這種問題。
三、解決方法
1、修改kl文件
 經(jīng)測(cè)試發(fā)現(xiàn),只有GAS和BRAKE輸入的時(shí)候,映射軟件無法識(shí)別;通過配置kl文件將兩個(gè)扳機(jī)鍵綁定到LTRIGGER和RTRIGGER,映射軟件就可以識(shí)別,并且部分設(shè)備設(shè)置到這一步就可以實(shí)現(xiàn)扳機(jī)鍵的映射,如果還是無法完成映射請(qǐng)看第二期。
這里使用1UP GC1手柄進(jìn)行演示,這個(gè)手柄的扳機(jī)輸入只有GAS和BRAKE,通過修改kl文件之后可以有LTRIGGER和RTRIGGER的輸入信號(hào)。
kl文件位于/system/usr/keylayout目錄中,部分設(shè)備需要解鎖system分區(qū)才能修改,請(qǐng)自行解決分區(qū)解鎖的問題。
 kl文件的命名格式為文件命名格式為Vendor_xxxx_Product_xxxx.kl,如果能找到自己設(shè)備的文件,那么直接修改即可(一般是大廠設(shè)備比如xbox和ps手柄);而我手上的1UP GC1手柄在keylayout目錄中是沒有kl文件的,我們需要手動(dòng)創(chuàng)建。
下面教大家如何查找自己設(shè)備的vendor和product代碼。
 首先打開終端(題主用的Termux)并輸入su獲取root權(quán)限,輸入getevent命令,會(huì)彈出當(dāng)前的input event信息并實(shí)時(shí)打印輸入事件到屏幕上,我們隨便按兩下手柄上的按鍵可以看到終端中有輸出信息,記下自己設(shè)備的event編號(hào),題主這里是event21
 然后輸入getevent -i /dev/input/event21,就可以看到自己設(shè)備的信息(想了解這些信息代表什么意思可以自行查找linux輸入子系統(tǒng)的資料進(jìn)行學(xué)習(xí))
# getevent -i /dev/input/event21
可以看到vendor是1d79,product是1001,于是我們?cè)?system/usr/keylayout目錄中創(chuàng)建一個(gè)文件命名為Vendor_1d79_Product_1001.kl,打開后輸入以下內(nèi)容:(具體kl文件如何編寫請(qǐng)自行查找資料,網(wǎng)上都有的)
# 1UP GC1 key 304 BUTTON_A key 305 BUTTON_B key 307 BUTTON_X key 308 BUTTON_Y key 310 BUTTON_L1 key 311 BUTTON_R1 key 315 BUTTON_START key 314 BUTTON_SELECT key 172 BUTTON_MODE key 317 BUTTON_THUMBL key 318 BUTTON_THUMBLaxis 0x00 X axis 0x01 Y axis 0x02 Z axis 0x05 RZ axis 0x09 RTRIGGER ? ? ? ?#重點(diǎn) axis 0x0a LTRIGGER ? ? ? ?#重點(diǎn) axis 0x10 HAT_X axis 0x11 HAT_Y
 這邊要做的工作主要是將兩個(gè)扳機(jī)的axis量綁定到RTRIGGER和LTRIGGER,
 如果這兩句改為
 則app檢測(cè)到的只有GAS和BRAKE
不是所有手柄的輸入信號(hào)都是跟我這個(gè)手柄一樣,就是說扳機(jī)鍵的輸入信號(hào)不一定是0x09和0x0a,需要根據(jù)自己手柄的情況進(jìn)行修改,獲取輸入信號(hào)的方法如下:
 在終端中輸入getevent ?/dev/input/event21,拉一下左扳機(jī)可以看到很多輸出,這里的輸出全部使用16進(jìn)制表示,0003表示輸入ABS事件(即axis),000a就是我們寫在kl文件中的0x0a。同理設(shè)置右扳機(jī)。
 編輯完kl文件后保存重新連接手柄,就可以檢查自己的手柄扳機(jī)能否正常映射了。
 如果還是不能請(qǐng)看第二期。
總結(jié)
以上是生活随笔為你收集整理的安卓设备手柄无法映射线性扳机的解决思路(1)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: android 仿美团、大众点评滑动vi
 - 下一篇: 连接校园网的路由器为啥老是服务器没响应,