ハードウェア ボタン (電源、音量アップなど) を使用していくつかのアクションを開始する Xposed モジュールに取り組んでいます。ユーザーが使用するボタンを選択できるように、「設定」UI を追加したいと思います。
これまでのところ、いくつかの可能な解決策を見つけましたが、どれも私に適したものではありません。たとえば、次はすべて 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() のチェックは信頼性が低く、当てにできません。
実際に期待どおりに機能する、利用可能なハードウェア キーを確認するための別の解決策はありますか? またはさらに良いことに、使用可能なすべてのボタンの完全なリストを取得する方法はありますか?
また、音量ボタンが 1 つもないのに、deviceHasKey() が音量キー (_UP、_DOWN、_MUTE) に対して true を返す理由を誰かが説明できますか? デバイスが安価な中国のデバイスであるという事実のために実装が不十分な可能性があるデバイスの KeyCharacterMap と関係があるに違いないと思います。
私の3番目の質問は、デバイスがスリープ状態のときに機能するボタン(私の場合は電源、音量、F1)と機能しないボタン(メニュー、戻る、ホームなど、すべて下のタッチボタン)を区別する方法はありますか押し可能なボタンではなく、ディスプレイ(ディスプレイのソフトウェアボタンではありません)?
どんなヒントでも大歓迎です:)
前もって感謝します
- - -アップデート - - -
Burak Day が示唆するように、次の結果が得られ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
ご覧のとおり、デバイスは利用可能なボタンがあると認識しており、メーカーと話し合ったところ、デバイスにボタンを追加できることがわかりました(一定の金額を注文して、数千ドルの追加料金を支払う場合)。ただし、現在のバリエーションでは、ボタンは存在しません。
私の推測では、デバイスはモジュール式のボード/プロセッサ/ドライバーを使用しており、ボタンをはんだ付けするか、空白のままにしておくことができますが、ソフトウェアはボタンがボードにはんだ付けされているかどうかを認識していません。
ボタンが物理的に利用可能かどうかを知るにはどうすればよいですか? コードを明示的に変更せずに将来的に他のデバイスで実行できるように、モジュールをできるだけ汎用的にしたいと考えています。また、実際に存在しない場合は、可能なボタンをユーザーに表示したくありません。
もう 1 つのことは、デバイスがスリープ状態のときに使用できるボタン (電源、音量) と使用できないボタン (メニュー、ホーム、戻る、すべてタッチ ボタンであり、ディスプレイが電源がオフになっている場合、それらも電源がオフになっています)。
----更新 2----
event0 デバイスのキーの生の 16 進数値を確認しました。次に、「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 を返します...