Android在灭屏的情况下实现长按音量键切换歌曲

时间:2022-05-16 14:34:43

该功能的实现逻辑是:在按下音量键后延时3秒执行一个线程,而该线程使用来发送广播,使广播接收者执行上一曲或者下一曲的功能;如果再这3秒内,用户已经弹起按键(不再长按音量键),则取消执行该线程。

修改该功能是在framework/base\policy\src\com\android\internal\policy\impl\PhoneWindowManager.java的interceptKeyBeforeQueueing()方法中修改的。以长按音量减键为例:

 if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
                    if (down) {
                        if (isScreenOn && !mVolumeDownKeyTriggered
                                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0) {
                            mVolumeDownKeyTriggered = true;
                            mVolumeDownKeyTime = event.getDownTime();
                            mVolumeDownKeyConsumedByScreenshotChord = false;
                            cancelPendingPowerKeyAction();
                            interceptScreenshotChord();
                        }
  
                        else if(mSupportSkipSong && !mVolumeDownKeyTriggered
                                && (event.getFlags() & KeyEvent.FLAG_FALLBACK) == 0){
                            mVolumeDownKeyTriggered = true;
                            mVolumeDownKeyTime = event.getDownTime();
                            cancelPendingPowerKeyAction();


                            mHandler.postDelayed(mMusicOperationRunnable, MUSIC_OPERATION_DELAY);
                        }

                    } else {
                        if (mSupportSkipSong && mVolumeDownKeyTriggered){
                            Log.d(TAG,"mVolumeDownKeyTriggered:remove mMusicOperationRunnable!");
                            mHandler.removeCallbacks(mMusicOperationRunnable);
                        }

                   
                        mVolumeDownKeyTriggered = false;
                        cancelPendingScreenshotChordAction();
                    }
                }