onkeydown事件的拦截

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等事件;进一步做具体的事情;

音量上下键可以如上来做,但电源键是不能拦截的。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值