我正在使用硬件按钮(如电源,音量提升等)启动某些操作的Xposed模块。我想添加一个“设置”UI,以便用户可以选择他想要使用的按钮。Android 4.4获得硬件密钥ID(实际上可在设备上使用)
到目前为止,我找到了几种可能的解决方案,但他们都不符合我的要求。例如,以下全部返回true:
boolean hasMenuKey = ViewConfiguration.get(context).hasPermanentMenuKey();
boolean hasBackKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK);
boolean hasVolumeUpKey = KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_VOLUME_UP);
但是,该设备实际上根本没有任何音量键。通过记录硬件密钥,我发现“音量”键实际上是KEYCODE_F1。所以检查deviceHasKey()是不可靠的,我不能指望它。
是否有另一种解决方案来检查哪些硬件密钥可用,其实际上可以像您期望的那样工作?或者更好的是,有没有办法获得所有可用按钮的完整列表?
也有人可以解释为什么deviceHasKey()为音量键(_UP,_DOWN,_MUTE)返回true,而根本没有单个音量按钮?我认为它必须与设备的KeyCharacterMap有关,因为该设备是便宜的中国设备,所以可能实现的效果很差。
我的第三个问题是:有没有办法区分按钮在设备睡着时(功率,音量,F1在我的情况下)和不按钮(如菜单,返回,首页,这是显示屏下方的所有触摸按钮(不是显示屏上的软件按钮)而不是可按钮)?
任何暗示的高度赞赏:)
预先感谢您
----- UPDATE ------
至于建议由布拉克日,这里的adb shell getevent -lp
结果:
add device 1: /dev/input/event0
name: "mtk-kpd"
events:
KEY (0001): KEY_HOME KEY_END KEY_VOLUMEDOWN KEY_VOLUMEUP
KEY_POWER KEY_MENU KEY_BACK KEY_HP
KEY_CAMERA KEY_SEND
input props:
<none>
add device 2: /dev/input/event4
name: "mtk-tpd-kpd"
events:
KEY (0001): KEY_MENU KEY_BACK KEY_HOMEPAGE
input props:
<none>
could not get driver version for /dev/input/mouse0, Not a typewriter
add device 3: /dev/input/event3
name: "mtk-tpd"
events:
KEY (0001): KEY_MENU KEY_BACK KEY_HOMEPAGE BTN_TOUCH
ABS (0003): ABS_X : value 0, min 0, max 240, fuzz 0, flat 0, resolution 240
ABS_Y : value 0, min 0, max 240, fuzz 0, flat 0, resolution 240
ABS_PRESSURE : value 0, min 0, max 255, fuzz 0, flat 0, resolution 0
ABS_MT_TOUCH_MAJOR : value 0, min 0, max 100, fuzz 0, flat 0, resolution 0
ABS_MT_TOUCH_MINOR : value 0, min 0, max 100, fuzz 0, flat 0, resolution 0
ABS_MT_POSITION_X : value 0, min 0, max 240, fuzz 0, flat 0, resolution 0
ABS_MT_POSITION_Y : value 0, min 0, max 240, fuzz 0, flat 0, resolution 0
ABS_MT_TRACKING_ID : value 0, min 0, max 0, fuzz 0, flat 0, resolution 0
input props:
INPUT_PROP_DIRECT
add device 4: /dev/input/event2
name: "hwmdata"
events:
REL (0002): REL_Y
input props:
<none>
add device 5: /dev/input/event1
name: "ACCDET"
events:
KEY (0001): KEY_VOLUMEDOWN KEY_VOLUMEUP KEY_HANGEUL KEY_NEXTSONG
KEY_PLAYPAUSE KEY_PREVIOUSSONG KEY_STOPCD KEY_SEND
input props:
<none>
could not get driver version for /dev/input/mice, Not a typewriter
正如你所看到的,设备认为有可用的按钮和谈话后到制造商,我们发现他们可能增加更多的按钮到设备(如果我们会订购一定数额并支付数千美元额外)。但是,在当前版本中,按钮并不存在。
我的猜测是,该设备使用模块化电路板/处理器/驱动程序,您可以在其上焊接按钮或将它们留空,但软件不知道按钮是否焊接在电路板上。
我该如何知道一个按钮的物理可用性?我想让我的模块尽可能通用,以便将来可以在其他设备上运行,而无需明确更改代码。另外我不想显示可能的按钮给用户,如果他们不是真的存在。
另一件事是,我仍然需要一种方式来区别不同的按钮,这些按钮可用时,设备睡着(电源,音量)和那些不是(菜单,家庭,返回,所有这些都是触摸按钮和如果显示器断电,它们也会关闭)。
---- UPDATE 2 ----
我检查EVENT0设备的按键的原始十六进制值。然后我使用“mtk-kpd”翻译它们。。KL”字符映射表然后我用各自的KeyEvent ID来检查设备所有的人都返回true:
Log.d(Constants.LOG_TAG, "Home:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_HOME));
Log.d(Constants.LOG_TAG, "END:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_ENDCALL));
Log.d(Constants.LOG_TAG, "Volume Up:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_VOLUME_UP));
Log.d(Constants.LOG_TAG, "Volume Down:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_VOLUME_DOWN));
Log.d(Constants.LOG_TAG, "POWER:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_POWER));
Log.d(Constants.LOG_TAG, "Menu:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_MENU));
Log.d(Constants.LOG_TAG, "Back:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_BACK));
Log.d(Constants.LOG_TAG, "HP:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_FOCUS));
Log.d(Constants.LOG_TAG, "CAMERA:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_CAMERA));
Log.d(Constants.LOG_TAG, "Send:" + KeyCharacterMap.deviceHasKey(KeyEvent.KEYCODE_CALL));
是的,他们都返回true ...
谢谢,但我已经知道我的特定设备的关键。但是,我需要一个通用解决方案,以便可以使用可用硬件按钮列表动态地填充我的设置。这些设置是一项作为普通应用程序执行的活动。我想找出设置onCreate()中哪些硬件密钥可用。实际上我有两个设备,每个设备有两个硬件按钮。其中之一是电源按钮。第二个是第一个设备上的VOLUME_UP和第二个设备上的F1。两个设备返回true为deviceHasKey(KEYCODE_VOLUME_DOWN),但没有音量键 – xxtesaxx
好吧,我可能会误解你的评论。通过使用getevent检查硬件密钥,我发现输入event0有一堆密钥: KEY_HOME,KEY_END,KEY_VOLUMEDOWN,KEY_VOLUMEUP,KEY_POWER,KEY_MENU,KEY_BACK,KEY_HP,KEY_CAMERA,KEY_SEND。 – xxtesaxx
但是,我们的技术人员告诉我,处理器可能可以使用这些按钮,但没有按钮连接到处理器。只有电源和音量增加按钮实际连接。那么,deviceHasKey实际上不知道是否有密钥,但如果内核驱动程序说它能够拥有这些密钥,则返回true,这是否正确? – xxtesaxx