android 锁屏界面--屏蔽音量键,达到安全音量时不点击确定后,音量键无效

    首次在博客上写文章,既怕出现由于技术钻研不够深入,会出现误导各位博友之心,又是首次“丑媳妇见公婆”的忐忑之心,针对前面两篇文章的显示问题,表示歉意。 

  本章将会持续对power键方面进行探讨,同时也是站在巨人的肩膀之上,参考了许多博友文章,未能及时的记录下各位博友的链接;如果有博友的文章字段和语句,在我这文章中出现,烦请各位博友及时与我联系。

   问题现象描述一:在锁屏界面,屏蔽音量键

解决方案:我们知道android 按键方面在framework层的传递,首选会进入到PhoneWindowManager中,对各种按键进行预处理!针对此部分的理解后续会有部分介绍,在此只需

要记住按键传递在framework层处理是在PhoneWindowManager的interceptKeyBeforeDispatching()函数中,在其中对于音量键的处理部分如下:

  @Override
    public long interceptKeyBeforeDispatching(WindowState win, KeyEvent event, int policyFlags) {

final int keyCode = event.getKeyCode();
        final int repeatCount = event.getRepeatCount();
    final int metaState = event.getMetaState();
final int flags = event.getFlags();
        final boolean down = event.getAction() == KeyEvent.ACTION_DOWN;
        final boolean canceled = event.isCanceled();

.............

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

   if(isKeyguardShowingAndNotOccluded()){
  return -1;

                                                                                                                        }
                                                                                                              }
                                                               .............................
                                                                       }
   主要修改点加入上述绿色部分代码;其中isKeyguardShowingAndNotOccluded()函数在PhoneWindowManager就已经存在的,就是判断当前是否处于锁屏状态,返回值-1则代表按键已处理,不将按键事件继续往下传递!
    同时在此再提供一种思路,我这边未测试;因为按音量键时,会出现音量条;那么就直接找到音量条的显示逻辑,在其中加入判断当前是否处于锁屏?
其中源码位于frameworks\base\packages\SystemUI\src\com\android\systemui\volume下VolumeDialog.java 
 判断是否处于锁屏mKeyguard.isKeyguardLocked() ;其中 mKeyguard = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE)就是锁屏管理者;在合适的代码处加入判断,应该也能实现该需求!这两种需求的实现区别其实就是"一头一尾",在最开始传递处和最后处理的类中进行处理,都能实现相应的需求!唯一所需要的就是仔细的查看源码中对需求有利的代码和相应api函数,简洁高效的完成客户需求!
                                                                         问题描述二:在达到安全音量后,不点击确定键,音量up键无效
      达到安全音量时,按理来说不点击确定键,音量up键是无效的;只有点击确定键之后,才能继续增大音量;其提示语如下图
                                                                         
  解决方案:上述图片中的提示语位于
frameworks\base\packages\SystemUI\src\com\android\systemui\volume\SafetyWarningDialog.java
点击确定按钮,执行代码如下:
@Override
public void onClick(DialogInterface dialog, int which) {
mAudioManager.disableSafeMediaVolume(); //关闭安全音量模式
}
而且该类重写了按键的onKeyUp和onKeyDown函数;因此只需要在点击确定的代码中增加一个字段,如果点击则变true,否则为false;在onKeyUp函数中在判断该字段,然后再执行以前的逻辑,既可以实现在达到安全音量键时,如果不点击确定,音量up键是无效的!
同时,如果想修改该安全音量的警戒值,是在frameworks/base/core/res/res/values/config.xml,找到如下字段:
<integer name=" config_safe_media_volume_index">12</integer>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值