Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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 按Volume down(音量下降)会延迟调用onKeyDown(接通键下降)(而Volume up会及时调用)_Android_Volume_Onkeydown - Fatal编程技术网

Android 按Volume down(音量下降)会延迟调用onKeyDown(接通键下降)(而Volume up会及时调用)

Android 按Volume down(音量下降)会延迟调用onKeyDown(接通键下降)(而Volume up会及时调用),android,volume,onkeydown,Android,Volume,Onkeydown,我在一个非常简单的活动中实现了onKeyDown和onkeydup,并注意到音量下降键的奇怪行为 代码如下: public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN)) { B9=true; Log.w("Alon", "Volume_down Down "+SystemClock.elapse

我在一个非常简单的活动中实现了onKeyDown和onkeydup,并注意到音量下降键的奇怪行为

代码如下:

    public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN))
    {
        B9=true;
        Log.w("Alon", "Volume_down Down "+SystemClock.elapsedRealtime());
    }
    else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP))
    {
        B10=true;
        Log.w("Alon", "Volume_up Down "+SystemClock.elapsedRealtime());
    }
    else 
           return super.onKeyDown(keyCode, event);

    return true;
}
public boolean onKeyUp (int keyCode, KeyEvent event) 
{
    if ((keyCode == KeyEvent.KEYCODE_VOLUME_DOWN))
    {
        B9=false;
        Log.w("Alon", "Volume_down Up "+SystemClock.elapsedRealtime());
    }
    else if ((keyCode == KeyEvent.KEYCODE_VOLUME_UP))
    {
        B10=false;
        Log.w("Alon", "Volume_up Up "+SystemClock.elapsedRealtime());
    }
    else 
       return super.onKeyDown(keyCode, event);
    return true;
}
单击“增大音量”并尽可能快地放开可产生正确的结果:

12-15 17:43:22.215: W/Alon(751): Volume_up Down 74650325
12-15 17:43:22.265: W/Alon(751): Volume_up Up 74650374
12-15 17:43:22.705: W/Alon(751): Volume_up Down 74650818
12-15 17:43:22.765: W/Alon(751): Volume_up Up 74650878
12-15 17:43:23.566: W/Alon(751): Volume_up Down 74651675
12-15 17:43:23.656: W/Alon(751): Volume_up Up 74651768
12-15 17:43:24.107: W/Alon(751): Volume_up Down 74652222
12-15 17:43:24.177: W/Alon(751): Volume_up Up 74652284
在音量降低时执行相同操作不会:

12-15 17:44:13.139: W/Alon(751): Volume_down Down 74701252
12-15 17:44:13.139: W/Alon(751): Volume_down Up 74701253
12-15 17:44:13.840: W/Alon(751): Volume_down Down 74701950
12-15 17:44:13.840: W/Alon(751): Volume_down Up 74701950
12-15 17:44:14.751: W/Alon(751): Volume_down Down 74702863
12-15 17:44:14.761: W/Alon(751): Volume_down Up 74702865
12-15 17:44:15.431: W/Alon(751): Volume_down Down 74703546
12-15 17:44:15.431: W/Alon(751): Volume_down Up 74703547
12-15 17:44:16.673: W/Alon(751): Volume_down Down 74704785
12-15 17:44:16.673: W/Alon(751): Volume_down Up 74704785

我在Nexus4和GalaxyS两款手机上进行了测试,得到了相同的结果。这是安卓系统中已知的问题吗?我做错什么了吗?

音量下降+电源键是一种特殊的组合键,可触发屏幕截图

当VOLUME_DOWN(音量下降)键下降时,
PhoneWindowManager
会在发送之前拦截事件

PhoneWindowManager
告诉调度程序在调度前等待一点(150毫秒),以防用户触发屏幕截图。。。调度员就是这么做的:他等着

…然后音量下降键向上。调度程序可以立即调度VOLUME_DOWN up事件(即,在这种情况下:PhoneWindowManager没有任何理由告诉调度程序等待)

但是:队列中有挂起的卷。因此,调度员将音量调低,并在音量调低后立即调低音量

来自
PhoneWindowManager
的一些代码:

    // If we think we might have a volume down & power key chord on the way
    // but we're not sure, then tell the dispatcher to wait a little while and
    // try again later before dispatching.
    if (mScreenshotChordEnabled && (flags & KeyEvent.FLAG_FALLBACK) == 0) {
        if (mVolumeDownKeyTriggered && !mPowerKeyTriggered) {
            final long now = SystemClock.uptimeMillis();
            final long timeoutTime = mVolumeDownKeyTime + SCREENSHOT_CHORD_DEBOUNCE_DELAY_MILLIS;
            if (now < timeoutTime) {
                return timeoutTime - now;
            }
        }
        if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                && mVolumeDownKeyConsumedByScreenshotChord) {
            if (!down) {
                mVolumeDownKeyConsumedByScreenshotChord = false;
            }
            return -1;
        }
    }
//如果我们认为可能会有一个音量下降和电源键和弦在路上
//但我们不确定,然后告诉调度员等一会儿
//请稍后再试,然后再发送。
if(mScreenshotChordEnabled&(flags&KeyEvent.FLAG\u FALLBACK)==0){
如果(mVolumeDownKeyTriggered&!mPowerKeyTriggered){
final long now=SystemClock.uptimeMillis();
最终长超时=mVolumeDownKeyTime+屏幕截图\和弦\去抖动\延迟\毫秒;
如果(现在<超时时间){
返回timeoutTime-now;
}
}
如果(keyCode==KeyEvent.keyCode\u音量下降
&&mVolumeDownKeyConsumedByScreenshotChord){
如果(!向下){
mVolumeDownKeyConsumedByScreenshotChord=false;
}
返回-1;
}
}
非常感谢(我想你的意思是触发屏幕截图,而不是特别重新启动?)有没有其他方法可以覆盖此功能?