Android 长按音量加键变成上一曲,音量减键变成下一曲

长按音量加键变成上一曲,音量减键变成下一曲

实现原理看注释
frameworks/base/services/core/java/com/android/server/policy/PhoneWindowManager.java

//add by fengzc
boolean mVolUpConsumed;
boolean mVolUpSendBySelf;/
boolean mVolDownConsumed;
boolean mVolDownSendBySelf;
//end by fengzc

/** {@inheritDoc} */
    @Override
public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int 
policyFlags) {
        final boolean keyguardOn = keyguardOn();
        ....
       else if (keyCode == KeyEvent.KEYCODE_VOLUME_UP
                || keyCode == KeyEvent.KEYCODE_VOLUME_DOWN
                || keyCode == KeyEvent.KEYCODE_VOLUME_MUTE) {
            if (mUseTvRouting) {
                // On TVs volume keys never go to the foreground app.
                dispatchDirectAudioEvent(event);
                return -1;
            }
			//add by fengzc 长按音量加键为上一曲,音量减键为下一曲
			if (keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
			if (down) {
				if (repeatCount == 0) {
					if (!mVolUpSendBySelf) {
						//用户短按下down时不分发该事件,等up时,自己模拟发送一个音量加键事件
						//这样避免长按音量加键时也会触发音量加键,导致音量调节窗口弹出
						return -1;
					}
				} else if (repeatCount == 11) {//时间差不多就是500ms长按事件
					mVolUpConsumed = true;
					//模拟发送上一曲事件
					sendNoahKeyCode(KeyEvent.KEYCODE_MEDIA_PREVIOUS);
					return -1;
				} else {
					return -1;
				}
			} else {
				if (mVolUpConsumed) {
					mVolUpConsumed = false;
					return -1;
				} else {
					if (!mVolUpSendBySelf) {
						//自己模拟发送一个音量加键事件
						sendNoahKeyCode(KeyEvent.KEYCODE_VOLUME_UP);
						mVolUpSendBySelf = true;
					} else {
						mVolUpSendBySelf = false;
					}
				}
			}
		} else if (keyCode == KeyEvent.KEYCODE_VOLUME_DOWN) {
			if (down) {
				if (repeatCount == 0) {
					if (!mVolDownSendBySelf) {
						return -1;
					}
				} else if (repeatCount == 11) {
					mVolDownConsumed = true;
					sendNoahKeyCode(KeyEvent.KEYCODE_MEDIA_NEXT);
					return -1;
				} else {
					return -1;
				}
			} else {
				if (mVolDownConsumed) {
					mVolDownConsumed = false;
					return -1;
				} else {
					if (!mVolDownSendBySelf) {
						sendNoahKeyCode(KeyEvent.KEYCODE_VOLUME_DOWN);
						mVolDownSendBySelf = true;
					} else {
						mVolDownSendBySelf = false;
					}
				}
			}
		}
		//end by fengzc
        } 
....

///add by fengzc 模拟按键发送
private void sendNoahKeyCode(final int keyCode){  
        new Thread () {  
            public void run() {  
                try {  
                    Instrumentation inst = new Instrumentation();  
                    inst.sendKeyDownUpSync(keyCode);  
                } catch (Exception e) {  
                    Log.e("Exception when sendNoahKeyCode", e.toString());  
                }  
            }  
        }.start();  
    }
///end by fengzc                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值