2014-12-15 1 views
2

아주 간단한 작업으로 onKeyDown 및 onKeyUp을 구현했으며 볼륨 작게 키를 사용하여 이상한 동작을 발견했습니다. 여기 볼륨을 낮추면 onKeyDown이 늦게 호출됩니다 (볼륨 업이 시간 내에 호출하는 동안)

코드입니다 :

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 

볼륨 작게과 동일하지 않습니다 수행 :

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: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 

두 대의 휴대 전화 (Nexus 4 및 Galaxy S)에서 동일한 결과가 테스트 및 획득되었습니다. 알려진 이슈 안드로이드에서? 내가 뭔가 잘못하고 있는거야?

답변

1

VOLUME_DOWN + POWER_KEY는 스크린 샷을 트리거하는 특수 키 조합입니다.

VOLUME_DOWN 키가 내려 오면 PhoneWindowManager에 의해 디스패치되기 전에 이벤트가 차단됩니다.

PhoneWindowManager이 스크린 샷은 사용자에 의해 트리거되는 경우에 대비해 파견하기 전에 (150 밀리 초) 조금 기다려야 발송자에게 알려줍니다 ... 그리고 그 디스패처가하는 일이다 : 그는 기다릴 ...

. VOLUME_DOWN 키가 올라갑니다. 디스패처는 즉시 VOLUME_DOWN 업 이벤트를 전달할 수 있습니다 (즉, PhoneWindowManager는 디스패처에게 기다려야 할 이유가 없습니다).

하지만 대기열에 보류 중 VOLUME_DOWN이 있습니다. 따라서 디스패처는 VOLUME_DOWN을 (를) 아래로 그리고 VOLUME_DOWN을 (를) 즉시 전달합니다.

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; 
     } 
    } 
+0

가 대단히 감사합니다 내가이 메소드를 오버라이드 (override) 할 수 어쨌든 있나요 (? 난 당신이 스크린 샷이 아닌 특별한 재부팅을 유발 의미 생각)? – user1108591

관련 문제