2011-10-07 93 views
0

我已經看到幾個類似的問題與解決方案,但我找不到適合我的情況。音量首選項 - 阻止音量鍵

我正在使VolumePreference(擴展DialogPreference)讓我們的用戶選擇音量級別的一些警報。

在其他優選情況下,用戶選擇在警報期間播放的期望的鈴聲。當用戶在VolumePreference中選擇音量時也會播放,所以他知道它實際上是如何發聲的。

在另一個首選項中,用戶選擇是否在播放時應該「覆蓋」手機的媒體音量級別 - 我這樣做,所以如果用戶想要具有固定音量級別的鬧鈴,那麼它不應該受到音量鍵等。 如果用戶選擇這樣做,在AlarmActivity中開始播放鬧鐘之前,我使用AudioManager將音量設置爲最大音量,並攔截音量鍵的所有keyDown事件,在鬧鐘結束後恢復音量級別。

問題是,我無法阻止我的VolumePreference中的音量鍵,因爲沒有onKeyDown方法。

經過一番檢查後,我發現AudioManager的registerMediaButtonEventReceiver方法是「註冊一個組件作爲MEDIA_BUTTON意圖的唯一接收者」,我相信這可能有助於我的情況(製作一些空的接收器),甚至進行音量鎖定更普遍的(註冊時,我要開始鎖定,註銷後解鎖),但它是從API8工作,而我正在爲API7應用程序 - 這仍持有超過市場的10%,從我讀,所以我想堅持到它。

有關如何阻止PreferenceDialog中音量更改的任何想法?

回答

0

經過一番思考解決方案被證明是非常簡單 - 一個可以覆蓋的onkeydown在DialogPreference的onCreateDialogView創建或設置視圖的onKeyListener觀的方法。

第一個例子:

LinearLayout layout = new LinearLayout(mContext) 
    { 
     @Override 
     public boolean onKeyDown(int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN 
        || keyCode == KeyEvent.KEYCODE_VOLUME_UP) return true; 
      return super.onKeyDown(keyCode, event); 
     } 

     @Override 
     public boolean onKeyUp(int keyCode, KeyEvent event) { 
      if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN 
        || keyCode == KeyEvent.KEYCODE_VOLUME_UP) return true; 
      return super.onKeyUp(keyCode, event); 
     } 
    }; 

第二個例子(mDialogView保存參考從第一示例佈局):

mDialogView.setOnKeyListener(new View.OnKeyListener() { 

      @Override 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN 
         || keyCode == KeyEvent.KEYCODE_VOLUME_UP) 
        return true; 
       return false; 
      } 
     }); 

我已經選擇第二解決方案,因爲我認爲這是兩個更靈活原因至少

  • 我可以剛剛刪除偵聽器來阻止音量鍵,而在第一種方法我不能
  • 在第一個解決方案
  • 我需要決定,如果我想阻止按鍵輸入,同時創建視圖 - 如果VolumePreference沒有太大的用處是擴大其他一些偏好,不應該阻止鍵輸入