[转载需注明作者及出处]
此方案需要安卓设备已经获取Root权限,并且本文只提供一个解决思路,文中所给代码并不能直接用在自己的设备上,请自行修改以适配自己的设备。
测试设备:小新pad pro 2021,安卓11

一、前言
众所周知移动端原生支持手柄的游戏实在不多,要用手柄畅玩流行手游基本上需要映射,还有模拟器使用手柄作为输入设备也需要通过键位映射。
博主最近买了很多手柄用在安卓设备上,发现其中有一些手柄的线性扳机无法使用映射app映射成屏幕点击,使用天际线模拟器时也无法成功映射成L2R2键,我研究了一个晚上解决了这个问题,并为手柄功能拓展提出了一些思路,故写此文为遇到同样问题的朋友提供参考。
理论上适用于所有手柄,已Root的安卓设备和Linux设备。
测试所用手柄:
原装DualShock 4(PS4配柄):USB连接和蓝牙连接,线性扳机
国产DualShock 4:蓝牙连接,线性扳机
1UP GC1(乐升盒子配柄):蓝牙连接,线性扳机
Obox OC1(蜗牛主机配柄):蓝牙连接,线性扳机
Fuze手柄(战斧F1主机配柄):蓝牙连接,线性扳机
国产xbox360手柄有线:USB连接,线性扳机
飞智八爪鱼一代:蓝牙连接,USB2.4G接收器,线性扳机
飞智Wee一代:蓝牙连接,无线性扳机
映射使用的APP(线性扳机无法映射的问题应该与APP无关):
ZUI外设模式
北通游戏厅
Mantis Gamepad
Shanwan Gamepad

二、问题分析
博主测试不同手柄线性扳机输入的过程中,发现了三种不同的输入模式:
1、只有GAS和BRAKE输入。

2、同时有GAS/RTRIGGER 和 BRAKE/LTRIGGER的输入信号并且绑定在一起。


3、不仅同时有GAS/RTRIGGER 和 BRAKE/LTRIGGER的输入信号(ABS事件),并且在线性扳机的值达到某个阈值时会触发输入BUTTON_L2或BUTTON_R2(KEY事件),这种情况是手柄内部程序做了补偿,可能是为了兼容其他平台(ds4和飞智八爪鱼就是这种输入模式)。

第一种情况通常表现为在软件中设置键位映射时识别不到扳机键
第二种情况通常表现为在软件中设置键位映射可以将扳机键识别为L2/R2,但是在游戏中无法触发映射;
第三种情况则可以正常识别按键也可以正常触发。

因为线性扳机的输入事件与摇杆同为ABS事件,输入的是模拟量;而普通按键输入的是KEY事件,只有0和1两种输入;我们点击屏幕的行为跟KEY事件是同类型的,如果手柄自身没有做BUTTON_L2/R2输入补偿,大部分映射软件不能把模拟输入映射为按键输入,因此出现了线性扳机无法映射的情况。
而博主使用飞智Wee手柄没有线性扳机,扳机键跟普通按键一样输入KEY事件,就不存在这种问题。

三、解决方法
1、修改kl文件
经测试发现,只有GAS和BRAKE输入的时候,映射软件无法识别;通过配置kl文件将两个扳机键绑定到LTRIGGER和RTRIGGER,映射软件就可以识别,并且部分设备设置到这一步就可以实现扳机键的映射,如果还是无法完成映射请看第二期。
这里使用1UP GC1手柄进行演示,这个手柄的扳机输入只有GAS和BRAKE,通过修改kl文件之后可以有LTRIGGER和RTRIGGER的输入信号。
kl文件位于/system/usr/keylayout目录中,部分设备需要解锁system分区才能修改,请自行解决分区解锁的问题。
kl文件的命名格式为文件命名格式为Vendor_xxxx_Product_xxxx.kl,如果能找到自己设备的文件,那么直接修改即可(一般是大厂设备比如xbox和ps手柄);而我手上的1UP GC1手柄在keylayout目录中是没有kl文件的,我们需要手动创建。
下面教大家如何查找自己设备的vendor和product代码。
首先打开终端(题主用的Termux)并输入su获取root权限,输入getevent命令,会弹出当前的input event信息并实时打印输入事件到屏幕上,我们随便按两下手柄上的按键可以看到终端中有输出信息,记下自己设备的event编号,题主这里是event21

$ su# getevent


然后输入getevent -i /dev/input/event21,就可以看到自己设备的信息(想了解这些信息代表什么意思可以自行查找linux输入子系统的资料进行学习)

# getevent -i /dev/input/event21

可以看到vendor是1d79,product是1001,于是我们在/system/usr/keylayout目录中创建一个文件命名为Vendor_1d79_Product_1001.kl,打开后输入以下内容:(具体kl文件如何编写请自行查找资料,网上都有的)

# 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        #重点
axis 0x0a LTRIGGER        #重点
axis 0x10 HAT_X
axis 0x11 HAT_Y

这边要做的工作主要是将两个扳机的axis量绑定到RTRIGGER和LTRIGGER,
如果这两句改为

axis 0x09 GAS
axis 0x0a BRAKE

则app检测到的只有GAS和BRAKE
不是所有手柄的输入信号都是跟我这个手柄一样,就是说扳机键的输入信号不一定是0x09和0x0a,需要根据自己手柄的情况进行修改,获取输入信号的方法如下:
在终端中输入getevent  /dev/input/event21,拉一下左扳机可以看到很多输出,这里的输出全部使用16进制表示,0003表示输入ABS事件(即axis),000a就是我们写在kl文件中的0x0a。同理设置右扳机。

getevent  /dev/input/event21


编辑完kl文件后保存重新连接手柄,就可以检查自己的手柄扳机能否正常映射了。
如果还是不能请看第二期。

安卓设备手柄无法映射线性扳机的解决思路(1)相关推荐

  1. 【Unity】因为获取安卓ID等隐私数据无法通过审核解决思路

    目录 一.快速筛查可能导致获取了android_id的行为: 二.安卓自测获取隐私内容代码调用情况 一.快速筛查可能导致获取了android_id的行为: 打开ProjectSettings文件夹下的 ...

  2. 【用PS3手柄在安卓设备上玩游戏系列】连接手柄和设备

    背景 硬件要求1:PS3 手柄 + 手柄配套的USB线 硬件要求2:已经获得 ROOT 权限并且支持蓝牙的安卓设备 软件要求1:Sixaxis Compatibility Checker PS3 手柄 ...

  3. 将你的安卓设备打造成一台复古游戏机

    拥有一台Android设备的最大好处之一是可以用它来模拟许多老的游戏主机.从世嘉5代到任天堂64(如果你的设备够快的话甚至可以模拟任天堂DS),都有许多模拟器可供Android设备所用,而且全都不用破 ...

  4. 安卓设备的Socket网络通讯例程 (A2) -UI界面适配

    安卓设备的Socket网络通讯例程 (A2)-UI界面适配 本博文系JGB联合商务组的原创作品,引用请标明出处 JGB02开发板使用ESP8266芯片组的串口引脚TXD(22脚),RXD(21脚)与一 ...

  5. 安卓设备逐步升级Android 9,游戏产品该如何做适配?

    今年8月,谷歌发布了Android 9的正式版系统Pie,一些品牌的安卓设备也开始陆续加入到版本更新的阵营之中. 由于谷歌方面发布Android 9的时间距今还不到半年,硬件厂商仍需要一些时间进行定制 ...

  6. 教程:手机数据恢复 安卓设备内置存储器创建镜像到电脑数据恢复

    教程:手机数据恢复 安卓设备内置存储器创建镜像到电脑数据恢复 2014-7-17 10:59| 发布者: 蝴蝶| 查看: 20538| 评论: 7|原作者: 330wang|来自: INTOHARD独 ...

  7. HDR 色调映射线性压缩(matlab)

    HDR 色调映射线性压缩(matlab) 目录 HDR 色调映射学习(matlab) 1.介绍 2.matlab在HDR上的应用 参考文章: 1.介绍 即使在引入数码相机之后,多年来,专业摄影师还是更 ...

  8. 安卓设备通过USB串口与STM32单片机通讯之二

    安卓设备通过USB串口与STM32单片机通讯之二 本博文系JGB联合商务组的原创作品,引用请标明出处. 本博文接续上一篇的末尾章节. (二) APP的JAVA代码部分(使用Android Studio ...

  9. Sonic 开源移动端云真机测试平台 - 设备中心接入安卓设备实例演示,Agent端服务部署过程详解

    Sonic 开源移动端云真机测试平台 - Agent端服务部署与安卓设备接入演示 一加8手机连接效果图展示 第一章:环境准备 ① agent-sources 资源包下载 ② Android SDK安装 ...

  10. 浏览器复制不进行url编码_谷歌浏览器测试版支持在PC上复制号码并操作关联安卓设备进行拨打...

    本周早些时候我们提到微软更新「你的手机」应用,可以在关联安卓设备后直接在桌面平台拨打或者接听电话等. 谷歌这边的解决方案相对来说倒是简单粗暴很多,直接在谷歌浏览器里发送号码到安卓设备后即可自动发起呼叫 ...

最新文章

  1. Grub 修复(文件损坏)有备份
  2. 交叉验证python_急!请教一个python里交叉验证的问题
  3. 什么是 SAP Commerce Cloud 的 Paragraph component
  4. Java9Java10 Java11新特性
  5. 2018年4月10日--python解决乱码和作业
  6. 算法不会,尚能饭否之排序——直接插入排序(Insert sort)
  7. Android 实现点击按钮弹出日期选择器与时间选择器
  8. chainmaker 区块链配置文件位置 版本号
  9. cuda必须装在c盘吗_怎样把C盘的所有文件移到D盘或E盘里去?
  10. 手机vnc远程控制软件,手机vnc远程控制软件如何配置
  11. 长截图、识别图片里的文字,不用装其它软件!
  12. 用excel函数COUNTIF实现两列数据对比找出不同数据
  13. Web 前端学习之表单制作、网页超链接
  14. Swagger、Rap与Yapi接口管理
  15. uniapp小程序src引用服务器图片时全局变量与图片路径拼接
  16. Apple iPhone 8G手机误升级至2.0降级破解日记
  17. 腾讯区块链正式落地法律场景,携手慧狮构建“司法联盟链”
  18. html 自动执行vbs代码,vbs脚本文件执行-网页设计,HTML/CSS
  19. PC端和移动端微信加入群聊测试用例设计点
  20. Matlab之频域滤波下三大LPF

热门文章

  1. 标准的Java编码规范手册
  2. ADAMS2017AMESim2016联合仿真 设置教程及注意事项
  3. 风格迁移篇--CCPL:Contrastive Coherence Preserving Loss for Versatile Style Transfer多功能风格转换的对比连贯保持损失
  4. 爱了!再来推荐5个Java项目开发快速开发脚手架。项目经验和私活都不愁了~
  5. mysql如何导入mdl文件_将sql文件导入PowerDesigner中的方法(将oracle sql文件转换成mysql)...
  6. 【蓝桥杯真题】2021年蓝桥杯省赛B组题目解析+代码(C/C++)
  7. IDEA设置背景与字体大小
  8. CentOS hping3安装和应用
  9. CentOs 虚拟LINUX系统安装与虚拟环境配置
  10. 【编程知识】常用参考表对照表