android的按键事件是可以拦截,并自己处理的;
一般重写onkeydwon事件就行了;
@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
switch (keyCode) {
case KeyEvent.KEYCODE_VOLUME_UP:// 增大音量
// audioManagerM.adjustStreamVolume(AudioManager.STREAM_MUSIC,
// AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND
// | AudioManager.FLAG_SHOW_UI);
audioManagerC.adjustStreamVolume(AudioManager.STREAM_VOICE_CALL,
AudioManager.ADJUST_RAISE, AudioManager.FLAG_PLAY_SOUND
| AudioManager.FLAG_SHOW_UI);
break;
case KeyEvent.KEYCODE_VOLUME_DOWN:// 减小音量
// audioManagerM.adjustStreamVolume(AudioManager.STREAM_MUSIC,
// AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND
// | AudioManager.FLAG_SHOW_UI);
audioManagerC.adjustStreamVolume(AudioManager.STREAM_VOICE_CALL,
AudioManager.ADJUST_LOWER, AudioManager.FLAG_PLAY_SOUND
| AudioManager.FLAG_SHOW_UI);
break;
case KeyEvent.KEYCODE_BACK:// 再按一次退出
// 判断是否点了一次后退
if (isPressedBackOnce) {
// 已经点了一次,这是第二次
// 判断一下跟上一次点击的时间间隔,如果大于2秒,再谈一次吐司,小于2秒 直接finish
secondTime = System.currentTimeMillis();
if (secondTime - firstTime > 2000) {
// 第一次点击
ToastUtil.showToast(this, "再点一次退出");
isPressedBackOnce = true;
firstTime = System.currentTimeMillis();
} else {
if (!BaseApplication.getInstance().getParam(Params.IS_INDIVIDUAL_CALLING, false)) {
// 在2秒之内点击第二次
finish();
// finish完成之后当前进程依然在
isPressedBackOnce = false;
firstTime = 0;
secondTime = 0;
}
}
} else {
// 第一次点击
ToastUtil.showToast(this, "再点一次退出");
isPressedBackOnce = true;
firstTime = System.currentTimeMillis();
}
break;
case KeyEvent.KEYCODE_HEADSETHOOK:
break;
default:
return super.onKeyDown(keyCode, event);
}
// 为true,则其它后台按键处理再也无法处理到该按键,为false,则其它后台按键处理可以继续处理该按键事件
return true;
}
但如果现在的需求是,按手机侧面的上下键,而做其他的事情,不让其进行音量调节,要怎样做呢?
这就需要用到这个方法了:dispatchKeyEvent();从名字就可看出,是来对按键进行事件分发的;只要让他分发上下键时返回true,自己消费掉,就不会去调节音量了;
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
switch (event.getKeyCode()) {
case KeyEvent.KEYCODE_VOLUME_UP:// 增大音量
switch (event.getAction()) {
case KeyEvent.ACTION_DOWN://获取到按音量上键的down事件
break;
case KeyEvent.ACTION_UP://获取到按音量上键的up事件
downTimes = 0;
break;
return true;
case KeyEvent.KEYCODE_VOLUME_DOWN:// 减小音量
return true;
}
return super.dispatchKeyEvent(event);//其他按键可以直接分发出去,按原来逻辑处理就行。
}
可以看到不仅可以拦截音量上下键事件;而且可以拿到物理按键的down、up等事件;进一步做具体的事情;
音量上下键可以如上来做,但电源键是不能拦截的。