Ownsight

?找回密码
?立即注册
搜索
热搜: 活动 交友 discuz
查看: 950|回复: 0
打印 上一主题 下一主题

android home back键 屏蔽

[复制链接]

803

主题

903

帖子

3201

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
3201
跳转到指定楼层
楼主
发表于 2018-1-13 06:39:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
FBI Warning:欢迎转载,但请标明出处:http://blog.csdn.net/codezjx/article/details/45485975,未经本人同意请勿用于商业用途,感谢支持!
(1)屏蔽返回键:??重写onBackPressed()即可,不调用超类方法
[java] view plain copy


  • @Override??
  • public void onBackPressed() {??
  • ? ? // super.onBackPressed();??
  • }??



(2)屏蔽Home键:
1、常规方法如下:(但是在Android4.0以上会失效)
[java] view plain copy


  • @Override??
  • public void onAttachedToWindow(){??
  • ? ? this.getWindow().setType(WindowManager.LayoutParams.TYPE_KEYGUARD);??
  • ? ? super.onAttachedToWindow();??
  • }??

并加入权限:

[html] view plain copy


  • ??



2、Android4.0以上的屏蔽方法:(较为猥琐,但在Android4.4以上会失效)
用WindowManager的addview方法将view加到窗口上,加上的时候将view的layoutparamas的type设为LayoutParams.TYPE_SYSTEM_ERROR。
并加上权限
原理:使用WindowManager在屏幕最前面加上一层view,并让其type设置为:LayoutParams.TYPE_SYSTEM_ERROR,官方对其解释是: internal system error windows, appear on top of everything they can,既显示在任何界面之上。并且设置flags 为LayoutParams.FLAG_NOT_TOUCHABLE,这样我们后面一层的View才能监听到触摸事件。然后我们可以设置所add的view是一个空view,就不会感觉前面多了一层东西,从而达到屏蔽Home键的效果。
参考代码:
[java] view plain copy


  • private void forbiddenHomeKey(){??
  • ? ? mWindowManager = this.getWindowManager();??
  • ? ? mWindowManagerParams = new LayoutParams();??
  • ? ? mWindowManagerParams.width = LayoutParams.WRAP_CONTENT;??
  • ? ? mWindowManagerParams.height = LayoutParams.WRAP_CONTENT;??
  • ? ?// internal system error windows, appear on top of everything they can??
  • ? ? mWindowManagerParams.type = LayoutParams.TYPE_SYSTEM_ERROR;??
  • ? ???// indicate this view don’t respond the touch event??
  • ? ? mWindowManagerParams.flags = LayoutParams.FLAG_NOT_TOUCHABLE;??
  • ? ? // add an empty view on the top of the window??
  • ? ? mEmptyView = new View(this);??
  • ? ? mWindowManager.addView(mEmptyView, mWindowManagerParams);??
  • }??


为什么设置了这个type后就可以屏蔽Home呢?我们可以看看PhoneWindowManager.java的interceptKeyBeforeDispatching()方法:


[java] view plain copy


  • final int typeCount = WINDOW_TYPES_WHERE_HOME_DOESNT_WORK.length;??
  • for (int i=0; i
  • ? ? if (type == WINDOW_TYPES_WHERE_HOME_DOESNT_WORK) {??
  • ? ?? ???// don't do anything, but also don't pass it to the app??
  • ? ?? ???return -1;??
  • ? ? }??
  • }??

WINDOW_TYPES_WHERE_HOME_DOESNT_WORK常量的值为:


[java] view plain copy


  • private static final int[] WINDOW_TYPES_WHERE_HOME_DOESNT_WORK = {??
  • ? ? WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,??
  • ? ? WindowManager.LayoutParams.TYPE_SYSTEM_ERROR,??
  • };??


所以type设置为上面两个之一就可以了!



3、关于Home的屏蔽,还有一种思路:
监听程序是否在前台显示(通过ActivityManager.getRunningAppProcesses()),如果没有,则马上把程序的task移动至前台(通过ActivityManager.moveTaskToFront())。但是Android早就已经想到这个漏洞,当你点击完home键后,系统的Launcher会有5秒的延迟保护。所有启动Activity、或者移动到前台的方法都会有5秒延迟。具体看stackoverflow上的解答,若需要破解此限制需要加入系统权限"android.permission.STOP_APP_SWITCHES":
也就是说,若没有系统权限的话,只能通过自己写第三方的Launcher即可破解,此方法经过撸主本人亲测有效!

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表