2016-05-30 2 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()のチェックは信頼できず、私はそれを信じることができません。

ハードウェアキーが実際に動作するかどうかを確認するためのもう1つのソリューションはありますか?それとも、もっといいボタンがありますか?

なぜ、deviceHasKey()がボリュームキー(_UP、_DOWN、_MUTE)に対してtrueを返すのかを説明できる人がいるでしょうか?私はそれがデバイスが安価な中国のデバイスであるという事実のために実装が不十分かもしれないデバイスのKeyCharacterMapと関係がなければならないと思う。

私の3番目の質問は、デバイスがスリープ状態にあるときに動作するボタン(私の場合は電源、音量、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 

あなたが見ることができるように、デバイスが利用可能と話をした後にボタンがあると思いますメーカーに、彼らはであることがわかりました。もし私たちが特定の金額を注文し、余分な数千ドルを支払うならば、ボタンを装置に追加してください。しかし、現在のバリエーションでは、ボタンは存在しません。

私の推測では、デバイスはモジュラボード/プロセッサ/ドライバを使用してボタンを半田付けするか空白のままにしておくことができますが、ソフトウェアはボタンがボード上にはんだ付けされているかどうかわかりません。

ボタンが物理的に利用可能かどうかはどのように知っていますか?将来的にコードを明示的に変更せずに他のデバイスで実行できるように、モジュールを可能な限り一般的なものにしたいと思います。また、実際に存在しない場合、ユーザーに可能なボタンを表示したくありません。

もう1つは、デバイスがスリープ(電源、ボリューム)していないときに利用できるボタンと、メニュー(ホーム、戻る、すべてがタッチボタン、ディスプレイの電源が切れている場合は、電源もオフになっています)。

---- UPDATE 2 ----

私はEVENT0デバイスのキーの生の進値をチェックします。その後、私は "mtk-kpd"を使って翻訳しました。KL」文字マップそれから私は、デバイスは、それらのすべてのためにtrueを返すかどうかを確認するために、それぞれのKeyEvent IDを使用:。

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)); 

そして、はい、彼らはすべての真を返す...

答えて

0

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

私の場合、ハードウェア/ソフトウェアはいくつかのボタンを持つことができます。しかし、実際には、ロジックボードに半田付けされたボタンはわずかです。

ボタンが実際にアプリケーションレベルでボードにハンダ付けされているかどうかを特定する方法はありません。

0

をあなたがadb shell getevent -lpを使用することができますデバイスのハードウェアキーをチェックする。

をそれはあなた/dev/input/フォルダからLinuxのレベルで可能なイベントと実際のデバイスを返します。

はあなたがのために求めていることにより、それらの間のキー入力装置を選択することができます、KEY_VOLUMEUPKEY_VOLUMEDOWNイベントのいずれかがハードキーとして受け入れられます。

デバイスがスリープ状態にあるときにのみハードキーが使用できます。

また、デバイスがスリープしているときにプロセッサを起動させておく必要がある場合は、PowerManagerPARTIAL_WAKE_LOCKを使用することもできます。

申し訳ありませんが、私はそれが最良の答えではないことを知っていますが、明確な説明のために私は私の答えを更新することができます。評判が低いため質問にコメントできませんでした。

+0

ありがとうございますが、私の特定のデバイスのキーはすでに分かっています。しかし、私は普遍的な解決策が必要です。そのため、使用可能なハードウェアボタンのリストを設定に動的に取り込むことができます。設定は、通常のアプリとして実行されるアクティビティです。 onCreate()の設定で利用可能なハードウェアキーを調べたいと思います。私は実際に2つのハードウェアボタンを持つ2つのデバイスを持っています。それらの1つは電源ボタンです。 2番目のデバイスは、最初のデバイスではVOLUME_UP、2番目のデバイスではF1です。どちらのデバイスもdeviceHasKey(KEYCODE_VOLUME_DOWN)ではtrueを返しますが、ボリュームキーはありません – xxtesaxx

+0

あなたのコメントが間違っている可能性があります。 geteventでハードウェアキーを調べると、入力イベント0には、 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

関連する問題