Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 音量首选项-阻止音量键_Android - Fatal编程技术网

Android 音量首选项-阻止音量键

Android 音量首选项-阻止音量键,android,Android,我在解决方案中也遇到过一些类似的问题,但我找不到一个适合我的情况 我正在制作VolumePreference扩展对话框首选项,让用户为某些报警选择音量级别 在其他首选项中,用户选择报警期间播放的所需铃声。当用户在VolumePreference中选择音量时,它也会播放,所以他知道它的实际声音 在另一个首选项中,用户选择播放时闹钟是否应覆盖手机的媒体音量-我会这样做,所以,如果用户希望为闹钟设置固定的音量级别,则它不应受到音量键等更改的影响。 如果用户选择这样做,在开始播放AlarmActivit

我在解决方案中也遇到过一些类似的问题,但我找不到一个适合我的情况

我正在制作VolumePreference扩展对话框首选项,让用户为某些报警选择音量级别

在其他首选项中,用户选择报警期间播放的所需铃声。当用户在VolumePreference中选择音量时,它也会播放,所以他知道它的实际声音

在另一个首选项中,用户选择播放时闹钟是否应覆盖手机的媒体音量-我会这样做,所以,如果用户希望为闹钟设置固定的音量级别,则它不应受到音量键等更改的影响。 如果用户选择这样做,在开始播放AlarmActivity中的报警之前,我使用AudioManager将音量设置为最大音量,并截获音量键的所有按键事件,在报警结束后恢复音量

问题是,我无法在VolumeReference中阻止卷键,因为没有onKeyDown方法

经过一些检查,我发现AudioManager的RegisterDiaButtonVentReceiver方法将一个组件注册为MEDIA_按钮意图的唯一接收器,我相信这有助于在我的情况下制作一些空接收器,甚至在我想要开始锁定、解锁后取消注册时使音量锁定更通用,但它是从API8开始工作的,而我正在为API7制作应用程序——从我所读到的内容来看,API7仍然占据着超过10%的市场份额,所以我想坚持下去


有没有关于如何阻止PreferenceDialog中的音量更改的想法?

在一些思考解决方案被证明非常简单之后-可以覆盖在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;
            }
        });
我选择了第二种解决方案,因为我认为它更灵活,至少有两个原因

我可以删除侦听器以停止阻止卷键,而在第一种方法中我不能 在第一个解决方案中,我需要决定在创建视图时是否要阻止关键点输入-如果VolumeReference扩展了一些不应该阻止关键点输入的其他首选项,那么就没有多大用处了