2016-05-30 38 views
0

我正在使用硬件按钮(如电源,音量提升等)启动某些操作的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 ...

回答

0

我得出的结论是,如果设备制造商做得不好,没有可靠的方法可以找出哪些硬件按钮可用。

就我而言,就是硬件/软件能够有几个按钮。但是,该器件实际上只有几个按钮焊接在逻辑板上。

没有办法确定按钮是否实际焊接到应用程序级别的电路板上。

0

您可以使用adb shell getevent -lp为检查硬件按键的设备上。

它会回报你从/dev/input/文件夹在Linux上水平可能发生的事件的实际设备。

你可以选择其中的关键的输入设备通过寻求KEY_POWER,KEY_VOLUMEUP,KEY_VOLUMEDOWN事件并查看哪些被接受为硬键。

设备睡着时,只有硬键可用。

或者,如果您需要在设备处于睡眠状态时保持处理器不醒,则可以使用PowerManagerPARTIAL_WAKE_LOCK

对不起,我知道这不是最好的答案,但有一个清晰的解释,我可以更新我的答案。由于名誉低下,无法对您的问题发表评论。

+0

谢谢,但我已经知道我的特定设备的关键。但是,我需要一个通用解决方案,以便可以使用可用硬件按钮列表动态地填充我的设置。这些设置是一项作为普通应用程序执行的活动。我想找出设置onCreate()中哪些硬件密钥可用。实际上我有两个设备,每个设备有两个硬件按钮。其中之一是电源按钮。第二个是第一个设备上的VOLUME_UP和第二个设备上的F1。两个设备返回true为deviceHasKey(KEYCODE_VOLUME_DOWN),但没有音量键 – xxtesaxx

+0

好吧,我可能会误解你的评论。通过使用getevent检查硬件密钥,我发现输入event0有一堆密钥: KEY_HOME,KEY_END,KEY_VOLUMEDOWN,KEY_VOLUMEUP,KEY_POWER,KEY_MENU,KEY_BACK,KEY_HP,KEY_CAMERA,KEY_SEND。 – xxtesaxx

+0

但是,我们的技术人员告诉我,处理器可能可以使用这些按钮,但没有按钮连接到处理器。只有电源和音量增加按钮实际连接。那么,deviceHasKey实际上不知道是否有密钥,但如果内核驱动程序说它能够拥有这些密钥,则返回true,这是否正确? – xxtesaxx

相关问题