android 锁屏界面--屏蔽音量键,达到安全音量时不点击确定后,音量键无效
2017-09-18 20:40
1271 查看
首次在博客上写文章,既怕出现由于技术钻研不够深入,会出现误导各位博友之心,又是首次“丑媳妇见公婆”的忐忑之心,针对前面两篇文章的显示问题,表示歉意。
本章将会持续对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>
本章将会持续对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>
相关文章推荐
- 疑难杂症之——Android点击Home键无法返回主界面,并在松开时闪现锁屏界面
- android 开机后第一次显示锁屏界面时点击紧急呼叫,下拉状态栏,不停的闪屏
- Android中界面切换时卡顿点击无效的另类原因
- 【Android 7.1.1】 锁屏界面点击“空白处”响应事件
- android取消点击音量键弹出音量调节界面
- Android 中ListView setOnItemClickListener点击无效原因分析
- Android(2) 实现摇晃锁屏,类似与点击关机按钮
- Android Splash界面支持用户点击 直接进入主界面
- 17-Android界面控件之Button,点击Button然后出现提示信息
- android view点击事件无效 OnClickListener
- Android 在锁屏界面添加未读短信和电话提醒
- Android中导入Unity项目,界面点击事件失去焦点问题
- Android Button 点击事件无效
- Android悬浮窗屏蔽悬浮窗外部所有的点击
- Android 微盘开发步骤--主界面TabHost控件点击动画
- Android 收音机音量开到最大都没有“将音量调高到安全级别以上?会损坏听力”提示
- Android中WebView点击事件的拦截跳转到原生的界面
- Android点击事件之后跳到界面指定位置
- Android锁屏或灭屏状态下,快速按两次音量下键实现抓拍功能(1.1Framework层使用广播形式实现)
- Android基础——界面布局简介、点击事件处理