BT手柄按键失灵的问题(1)

最近遇到一个问题,某些2.4G Input设备(应该是扫描按键设备,还包括BT手柄),进入到某些Activity之后,返回/确定按键失效 。

蓝牙手柄上的X和B键是复用的,在输入的时候X按下发挥确认键的功能,B则被解析为返回键。
进入某些Activity之后,X键和B键失去了复用功能,不能被解析为确认和返回,此时蓝牙手柄除了上下左右,其他的键功能基本丧失。


分析流程如下,

1,从Kernel的打印来看,正常和异常的时候,上传的数据完全一样。

从getevent来跟踪,按下手柄的确定键,也就是说按次键会有两个键值上报。

对上层能够报两个键值(DPAD_CENTER和BUTTON_X):
/dev/input/event6: 0004 0004 000900b9
/dev/input/event6: 0004 0004 000900b8
/dev/input/event6: 0004 0004 00090004 //这3个是一个MSC事件,是scan(#define MSC_SCAN 0x04 ),这三个扫描键对应的键值是DPAD_CENTER
/dev/input/event6: 0001 0133 00000001 //这一个KEY类型的事件(#define EV_KEY 0x01 ),键值为BUTTON_X(#define BTN_X 0x133 ),Value为按下
/dev/input/event6: 0000 0000 00000000 //SYNC信号

/dev/input/event6: 0004 0004 000900b9
/dev/input/event6: 0004 0004 000900b8
/dev/input/event6: 0004 0004 00090004
/dev/input/event6: 0001 0133 00000000
/dev/input/event6: 0000 0000 00000000 //对应的是抬起

2,InputReader和InputDispatcher的打印对比:
只有的对应的eventTime 不一样,其它的参数一致。
正常的时候:
D/InputReader( 5681): BatchSize: 5 Count: 5
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b9 when=164199285971000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b8 when=164199285971000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x00090004 when=164199285971000
D/InputReader( 5681): Input event: device=7 type=0x0001 code=0x0133 value=0x00000001 when=164199285971000
E/InputReader( 5681): >>>koffu,key dwon,keyDownIndex = -1 , policyFlags = 0
E/InputReader( 5681): ,metaStateChanged = 0
D/InputReader( 5681): Input event: device=7 type=0x0000 code=0x0000 value=0x00000000 when=164199285971000
D/InputDispatcher( 5681): notifyKey - eventTime=164199285971000, deviceId=7, source=0x501, policyFlags=0x0, action=0x0, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, downTime=164199285971000
D/InputDispatcher( 5681): dispatchKey - eventTime=164199285971000, deviceId=7, source=0x501, policyFlags=0x42000000, action=0x0, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, repeatCount=0, downTime=164199285971000
D/InputReader( 5681): BatchSize: 5 Count: 5
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b9 when=164199465804000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b8 when=164199465804000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x00090004 when=164199465804000
D/InputReader( 5681): Input event: device=7 type=0x0001 code=0x0133 value=0x00000000 when=164199465804000
E/InputReader( 5681): >>>koffu,key up,keyDownIndex = 0
E/InputReader( 5681): ,metaStateChanged = 0
D/InputReader( 5681): Input event: device=7 type=0x0000 code=0x0000 value=0x00000000 when=164199465804000
D/InputDispatcher( 5681): notifyKey - eventTime=164199465804000, deviceId=7, source=0x501, policyFlags=0x0, action=0x1, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, downTime=164199285971000
D/InputDispatcher( 5681): dispatchKey - eventTime=164199465804000, deviceId=7, source=0x501, policyFlags=0x42000000, action=0x1, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, repeatCount=0, downTime=16419928597100

不正常的时候:
D/InputReader( 5681): BatchSize: 5 Count: 5
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b9 when=164463524127000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b8 when=164463524127000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x00090004 when=164463524127000
D/InputReader( 5681): Input event: device=7 type=0x0001 code=0x0133 value=0x00000001 when=164463524127000
E/InputReader( 5681): >>>koffu,key dwon,keyDownIndex = -1 , policyFlags = 0
E/InputReader( 5681): ,metaStateChanged = 0
D/InputReader( 5681): Input event: device=7 type=0x0000 code=0x0000 value=0x00000000 when=164463524127000
D/InputDispatcher( 5681): notifyKey - eventTime=164463524127000, deviceId=7, source=0x501, policyFlags=0x0, action=0x0, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, downTime=164463524127000
D/InputDispatcher( 5681): dispatchKey - eventTime=164463524127000, deviceId=7, source=0x501, policyFlags=0x42000000, action=0x0, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, repeatCount=0, downTime=164463524127000
D/InputReader( 5681): BatchSize: 5 Count: 5
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b9 when=164463749112000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x000900b8 when=164463749112000
D/InputReader( 5681): Input event: device=7 type=0x0004 code=0x0004 value=0x00090004 when=164463749112000
D/InputReader( 5681): Input event: device=7 type=0x0001 code=0x0133 value=0x00000000 when=164463749112000
E/InputReader( 5681): >>>koffu,key up,keyDownIndex = 0
E/InputReader( 5681): ,metaStateChanged = 0
D/InputReader( 5681): Input event: device=7 type=0x0000 code=0x0000 value=0x00000000 when=164463749112000
D/InputDispatcher( 5681): notifyKey - eventTime=164463749112000, deviceId=7, source=0x501, policyFlags=0x0, action=0x1, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, downTime=164463524127000
D/InputDispatcher( 5681): dispatchKey - eventTime=164463749112000, deviceId=7, source=0x501, policyFlags=0x42000000, action=0x1, flags=0x8, keyCode=0x63, scanCode=0x133, metaState=0x0, repeatCount=0, downTime=16446352412700



3,在ViewRootImpl的打印:

这是出错时候的确定键(只报一个值,而且是BUTTON_X,所以确定键没有作用)
I/System.out( 7044): >>>koffu processImmediately = true
V/ViewRootImpl( 7044): Sending input event to IME: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BUTTON_X, scanCode=307, metaState=0, flags=0x8, repeatCount=0, eventTime=165753574, downTime=165753574, deviceId=7, source=0x501 }
D/RemoteIME( 6847): keycode: 99, realAction: false
I/System.out( 7044): >>>koffu processImmediately = true
V/ViewRootImpl( 7044): Sending input event to IME: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BUTTON_X, scanCode=307, metaState=0, flags=0x8, repeatCount=0, eventTime=165753754, downTime=165753574, deviceId=7, source=0x501 }
D/RemoteIME( 6847): keycode: 99, realAction: true

这是正常时候的按确定键(报两个值(BUTTON_X和DPAD_CENTER) 正常)
I/System.out( 7791): >>>koffu processImmediately = true
V/ViewRootImpl( 7791): Sending input event to IME: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_BUTTON_X, scanCode=307, metaState=0, flags=0x8, repeatCount=0, eventTime=168524925, downTime=168524925, deviceId=7, source=0x501 }
D/RemoteIME( 6847): keycode: 99, realAction: false
I/System.out( 7791): >>>koffu processImmediately = false
V/ViewRootImpl( 7791): Sending input event to IME: KeyEvent { action=ACTION_DOWN, keyCode=KEYCODE_DPAD_CENTER, scanCode=307, metaState=0, flags=0x408, repeatCount=0, eventTime=168524925, downTime=168524925, deviceId=7, source=0x501 }
D/RemoteIME( 6847): keycode: 23, realAction: false
I/System.out( 7791): >>>koffu processImmediately = true
V/ViewRootImpl( 7791): Sending input event to IME: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_BUTTON_X, scanCode=307, metaState=0, flags=0x8, repeatCount=0, eventTime=168525183, downTime=168524925, deviceId=7, source=0x501 }
D/RemoteIME( 6847): keycode: 99, realAction: true
I/System.out( 7791): >>>koffu processImmediately = false
V/ViewRootImpl( 7791): Sending input event to IME: KeyEvent { action=ACTION_UP, keyCode=KEYCODE_DPAD_CENTER, scanCode=307, metaState=0, flags=0x408, repeatCount=0, eventTime=168525183, downTime=168524925, deviceId=7, source=0x501 }
D/RemoteIME( 6847): keycode: 23, realAction: true

思路:

1,这种蓝牙输入设备在其它Activity里面切换都能正常。但唯独进入某些Activity界面才触发确定键无效。
是不是和某些Activity的一些Layout属性有关?

2,但使用IR遥控器又不会出问题。IR遥控器(EV_KEY)和蓝牙手柄输入设备(EV_MSC和EV_KEY)的类型不一样。


solution:

通过修改对应的kl文件,把两个键值全部解析为需要的功能键。

比如,当按下确定按键之后,把BUTTON_X的值也指向DPAD_CENTER.


<think>嗯,用户问的是游戏手柄按键失灵问题,我需要详细分析可能的原因和解决方法。首先,得考虑硬件问题,比如按键接触不良或者内部积灰。然后,软件方面,比如驱动问题或者游戏内的设置。还有可能是无线连接的问题,比如信号干扰或电池没电。另外,不同平台(PC、主机、手机)可能有不同的处理方式,得分开说明。得一步步引导用户排查,从简单到复杂,比如先检查连接,再清洁按键,再更新驱动,最后考虑维修。还要提醒用户备份数据,如果自己拆解可能会影响保修。需要确保步骤清晰,语言易懂,避免专业术语太多,让用户能跟着操作。</think>游戏手柄按键失灵可能由硬件故障、软件冲突或连接问题导致,以下是逐步排查和解决方法: --- ### **一、基础排查** 1. **检查连接方式** - *有线手柄*:拔插USB接口,更换数据线或电脑端口测试。 - *无线手柄*: - 确认电池电量充足(低电量可能导致信号不稳定)。 - 重新配对蓝牙/Xbox无线适配器(关闭手柄电源再重启)。 2. **测试不同设备** - 将手柄连接到其他设备(如手机/另一台电脑/主机),确认是否为单一设备兼容性问题。 --- ### **二、清洁与硬件维护** 1. **清洁按键** - 用棉签蘸取少量酒精(75%浓度),轻擦失灵按键边缘,去除氧化层或污垢。 - 吹气或使用压缩空气清理按键缝隙(避免液体渗入)。 2. **检查内部结构** - *导电胶老化*:长期使用后导电胶磨损,需更换(需拆机,参考型号购买配件)。 - *薄膜电路板损坏*:肉眼观察是否有断裂/烧焦痕迹(需焊接修复或更换)。 --- ### **三、软件调试** 1. **更新驱动/固件** - *PC端*:通过设备管理器更新“人机接口设备”驱动,或官网下载专用驱动(如Xbox手柄访问[微软支持页面](https://support.microsoft.com))。 - *主机/手柄*:检查系统设置中的手柄固件更新选项。 2. **校准手柄** - *Windows*:控制面板 → 搜索“游戏控制器” → 选择手柄 → 属性 → 校准。 - *PlayStation/Xbox*:在主机设置中找到设备校准选项。 --- ### **四、进阶处理** 1. **排查软件冲突** - 关闭第三方手柄映射工具(如JoyToKey、DS4Windows)。 - 以管理员身份运行游戏,或关闭杀毒软件临时测试。 2. **重置手柄** - 部分手柄背部有复位孔(用卡针长按5秒恢复出厂设置)。 --- ### **五、维修建议** - *保修期内*:联系官方售后(自行拆解可能失去保修资格)。 - *过保设备*: - 更换导电胶/按键模块(成本约10-50元)。 - 主板损坏建议送修专业店铺(维修费通常100-300元)。 --- **注意事项**:若手柄进水/摔落,需立即断电并彻底干燥后再测试。复杂故障建议优
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

可夫小子

感谢大佬!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值