2012-07-22 30 views
1

我試圖重寫音量按鈕作爲上/下箭頭鍵(即它們應該將重點圍繞我所有的活動的重點,能夠查看。)如何欺騙箭頭鍵來我的活動在Android

爲此,我重寫我的活動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); 
} 

它被設置現在它使用上下不同的技術,但無論是否工作正常轉移焦點的方式。對於向上鍵,我只需手動調用dispatchKeyEvent()傳遞d-pad向上鍵和發生在音量按鈕上的相同動作(所以當我按下它時按下,當我釋放時它應該釋放)我對向上按鈕輸出看起來是這樣的:

press 24 
press 19 
release 24 
release 19 

了向下按鈕我調整稍微因爲我想,也許一個事實,即DPAD按發生的事情體積釋放打破之前,所以我做了一個可運行這將同時按下並釋放dpad按鈕

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

而且我延遲部分秒鐘以便我有機會釋放音量即我的下鍵輸出看起來是這樣的:

press 25 
release 25 
press 20 
release 20 

如果我插上USB鍵盤到我的設備,然後按方向鍵的焦點正確地移動,我看到輸出達:

press 19 
release 19 

和下降:

press 20 
release 20 

唯一的區別(只要我可以告訴)是,當我按下鍵盤上的箭頭的焦點其實正確地移動,當我按下不動彈VO lume按鈕(欺騙箭頭按鈕)

我可以在這裏忽略某些東西嗎?任何人都可以幫助我弄清楚如何欺騙我的活動箭頭鍵,以便他們實際上將焦點正確移動?

回答

2

我終於明白,您需要使用Instrumentation類來發送關鍵事件,並且出於某種原因您必須從主線程中刪除它。下面是將發送向下和向上的片段:如果您使用這些insdie從它會正確地左右移動焦點問題被覆蓋的dispatchKeyEvent

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