【问题标题】:How do screen overlays detect (and disable themselves) when a run-time permission is requested?当请求运行时权限时,屏幕覆盖如何检测(并禁用自身)?
【发布时间】:2017-06-09 14:41:28
【问题描述】:
如果应用程序在屏幕覆盖处于活动状态时请求用户授予运行时权限,系统会发出警告说已检测到屏幕覆盖 - 然后用户需要手动停用屏幕覆盖,直到他们真正可以授予权限。从用户体验的角度来看,这很糟糕。
但是最近我看到了一些应用程序 - 特别是 Facebook Messenger(聊天头) -
通过简单地在请求权限时自动禁用屏幕覆盖并在授予(或不授予)后再次启用自身来避免这种情况。
他们是如何做到这一点的,我该如何重现它?
我找不到任何与此相关的回调或广播。
【问题讨论】:
标签:
android
facebook-messenger
runtime-permissions
【解决方案1】:
这似乎只是一个配置问题,因为它会在正确的配置下自动运行。
WindowManager.LayoutParams params = new WindowManager.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
| WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL,
PixelFormat.RGBA_8888);
以前我使用 TYPE_SYSTEM_OVERLAY,但也玩过 TYPE_SYSTEM_ALERT。这给了我一些问题,即它不会被触摸,也不会“躲避”许可请求。或者它是可触摸的,但阻止屏幕键盘。
使用此配置,视图是可触摸的,屏幕键盘可以工作,并且在请求权限时会自动隐藏和显示覆盖视图,从而避免可怕的屏幕覆盖检测消息。