2011-10-07 92 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没有太大的用处是扩大其他一些偏好,不应该阻止键输入