我已经看到了几个与解决方案类似的问题,但我找不到一个适用于我的情况。
我正在制作VolumePreference(扩展DialogPreference),让用户为某些警报选择音量级别。
在其他偏好中,用户选择在闹铃期间播放的所需铃声。当用户在VolumePreference中选择音量时也会播放它,因此他知道它实际上是如何发声的。
在另一个偏好中,用户选择在播放时警报是否应“覆盖”手机的媒体音量级别 - 我这样做,因此如果用户想要具有固定音量级别以进行警报,那么它不应受到音量变化的影响钥匙等。 如果用户选择这样做,在开始在AlarmActivity中播放闹钟之前,我使用AudioManager将音量设置为最大音量,并拦截音量键的所有keyDown事件,并在闹钟结束后恢复音量。
问题是,我无法阻止我的VolumePreference中的音量键,因为没有onKeyDown方法。
经过一些检查,我发现AudioManager的registerMediaButtonEventReceiver方法“注册一个组件成为MEDIA_BUTTON意图的唯一接收者。”,我认为这可能有助于我的情况(制作一些空的接收器),甚至使音量锁定更多通用(当我想开始锁定时注册,解锁后取消注册),但是它正在从API8开始工作,而我正在为API7制作应用程序 - 它仍然占据了我读过的市场10%以上,所以我想坚持它
关于如何在PreferenceDialog中阻止音量变化的任何想法?
答案 0 :(得分:0)
经过一些思考解决方案证明非常简单 - 可以覆盖在DialogPreference的onCreateDialogView中创建的onKeyDown方法或设置该视图的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;
}
});
我选择了第二种解决方案,因为我觉得它更灵活,至少有两个原因