1

上/下矢印キーとして機能するように音量ボタンをオーバーライドしようとしています(つまり、フォーカス可能なすべてのアクティビティでフォーカスを移動する必要があります)。

dispatchKeyEvent()これを行うために、アクティビティメソッドをオーバーライドしています。これも試しonKeyDown()ましたが、ボリュームキーイベントの一部がまだシステムに送信されていたため、ボリュームを変更すると、デバイスにフィードバックが聞こえます。ビープ音は聞こえましたが、音量は実際には変更されていませんでした。に切り替えるとdispatchKeyEvent()、システムからのビープ音が消えました。

これが私の現在のdispatchKeyEvent()方法です:

@Override
public boolean dispatchKeyEvent(KeyEvent ke){
    int keyCode = ke.getKeyCode();
    if(ke.getAction() == KeyEvent.ACTION_DOWN){
        print("press " + keyCode);
        if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
        { 
            mTxt.postDelayed(pressDown, 600);
            return true;
        }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
        { 
            KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_UP); 
            dispatchKeyEvent(key); 
            return true;
        } 
    }else if(ke.getAction() == KeyEvent.ACTION_UP){
        print("release " + keyCode);
        if(keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) 
        { 
            /*KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN); 
            dispatchKeyEvent(keyUp);*/
            return true;
        }else if(keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
        { 
            KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_UP); 
            dispatchKeyEvent(keyUp);
            return true;
        } 
    }
    return super.dispatchKeyEvent(ke);
}

現在の設定方法では、上下に異なる手法を使用していますが、どちらもフォーカスをシフトするために正しく機能していません。Upキーの場合は、dispatchKeyEvent()を手動で呼び出して、d-pad upキーと、音量ボタンで実行したのと同じアクションを渡します(つまり、押すと押す必要があり、離すと離す必要があります)上ボタンの出力は次のようになります。

press 24
press 19
release 24
release 19

下ボタンについては、ボリュームリリースが壊れる前に十字キーが押されていたのではないかと思ったので、少し微調整しました。そこで、十字キーボタンを押して放すランナブルを作成しました。

    pressDown = new Runnable(){
        @Override
        public void run(){
            KeyEvent key = new KeyEvent(KeyEvent.ACTION_DOWN, KeyEvent.KEYCODE_DPAD_DOWN); 
            dispatchKeyEvent(key); 
            KeyEvent keyUp = new KeyEvent(KeyEvent.ACTION_UP, KeyEvent.KEYCODE_DPAD_DOWN); 
            dispatchKeyEvent(keyUp);
        }
    };

ボリュームをリリースする機会があるように、それを1秒ほど遅らせます。下ボタンの出力は次のようになります。

press 25
release 25
press 20
release 20

USBキーボードをデバイスに接続し、矢印キーを押すと、フォーカスが正しく移動し、出力が上に表示されます。

press 19
release 19

そしてダウンのために:

press 20
release 20

唯一の違いは(私が知る限り)、キーボードの矢印を押すとフォーカスが実際に正しく移動し、音量ボタン(矢印ボタンを偽装する)を押してもまったく移動しないことです。

私はここで何かを見落としていますか?誰かが私のアクティビティに矢印キーをスプーフィングして、実際にフォーカスを正しく移動させる方法を理解するのを手伝ってもらえますか?

4

1 に答える 1

2

最終的に、Instrumentation クラスを使用して重要なイベントを送信する必要があり、何らかの理由でメイン スレッドからそれを行う必要があることがわかりました。上下に送信されるスニペットは次のとおりです。

new Thread(new Runnable() {         
   @Override
   public void run() {                 
       new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
   }   
}).start();

new Thread(new Runnable() {         
   @Override
   public void run() {                 
       new Instrumentation().sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_UP);
   }   
}).start();

これらの insdie を質問からオーバーライドされた dispatchKeyEvent を使用すると、フォーカスが正しく移動します。

于 2012-08-08T03:27:10.797 に答える