Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.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,我正在开发一个应用程序,每当按下硬件音量按钮时,它都会监听音量事件。应用程序可以在前台或后台。我遵循了[这个](),但它不能正常工作。以下是我面临的问题 1) 如果我按一次音量按钮,事件将被触发4-6次。 2) 如果当前音量最大,并且我增加了音量,则事件不会触发 请帮助我。尝试使用以下代码- @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_

我正在开发一个应用程序,每当按下硬件音量按钮时,它都会监听音量事件。应用程序可以在前台或后台。我遵循了[这个](),但它不能正常工作。以下是我面临的问题

1) 如果我按一次音量按钮,事件将被触发4-6次。
2) 如果当前音量最大,并且我增加了音量,则事件不会触发


请帮助我。

尝试使用以下代码-

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)){
        //Do something
    }
    return true;
}

对于后台-

您可以通过轮询AudioManager来检测当前卷,这不是一个很好的解决方案,但我不知道更好

private Handler handler;
public int volume;

private Runnable volumeUpdater = new Runnable() {
    private int updatesInterval = 100;      
    @Override
    public void run() {
        if(volume != audioManager.getStreamVolume(AudioManager.STREAM_MUSIC)){
            //volume changed put logic here
        }
        handler.postDelayed(volumeUpdater, updatesInterval);
    }
};

在根设备上,您可以使用Xposed框架将自己连接到PhoneWindowManager。模块就是一个很好的例子。只要反编译一下,看看他们是怎么做的

尝试在你的应用程序中调用handler.post(volumeUpdater),每100ms循环将检查音量是否更改,因此如果它与保存的音量不同,你就知道用户按下了音量按钮。您可能必须将AudioManager.STREAM\u MUSIC更改为STREAM\u notification如果您找到更好的解决方案,我将很高兴听到。我很乐意从继承的代码中去掉这个问题。第一个问题解决了,我正在处理第二个问题。第二个问题解决后,我会尽快发布我的答案