0

ハードウェア ボタン (電源、音量アップなど) を使用していくつかのアクションを開始する 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 を返します...

4

2 に答える 2

1

私は、デバイスの製造元が悪い仕事をした場合に、どのハードウェア ボタンが利用可能かを確認する信頼できる方法がないという結論に達しました。

私の場合、ハードウェア/ソフトウェアが複数のボタンを持つことができるということです。ただし、実際には、デバイスにはロジック ボードにはんだ付けされたボタンがいくつかあります。

ボタンが実際にアプリ レベルでボードにはんだ付けされているかどうかを識別する方法はありません。

于 2016-06-10T06:58:39.593 に答える