检测到屏幕覆盖 - 如何在屏幕覆盖应用程序中处理此问题
Posted
技术标签:
【中文标题】检测到屏幕覆盖 - 如何在屏幕覆盖应用程序中处理此问题【英文标题】:Screen overlay detected - How to handle this in an screen overlay app 【发布时间】:2016-12-05 20:44:03 【问题描述】:某些设备具有额外的安全功能,并在显示权限对话框时检查应用是否在其他应用之上绘图。
我有一个侧边栏应用,必须先禁用我的应用,然后用户才能接受系统对话框。
问题
我应该如何处理这种情况? 有没有办法监听“系统对话框显示”事件,以便我可以删除我的侧边栏和“系统对话框已完成”,以便我知道,我可以继续使用我的侧边栏覆盖?我知道,停止服务就足够了(您不必删除权限),所以这也是一个解决方案编辑
我能想到的一个解决方案如下:
使用AccessibilityService
检查当前前台应用程序/视图。在那里我将能够检查显示当前前台活动甚至视图的事件...
我的问题:
我不知道如何识别那里的权限对话框。 其次,这迫使我要求用户获得此权限(我想避免这种情况,但拥有此服务的解决方案对我来说已经是一种改进,因为有些用户已经将此权限授予我的应用程序 -那时我将不得不问所有人并解释原因,这是我可以忍受的)。【问题讨论】:
【参考方案1】:据我所知,你想要的都是不可能的。在类似的question 中,有一个检测系统对话框的解决方案,但我认为它不适用于您的叠加层(仅适用于当前活动的活动)。
另一个question 建议可以通过ActivityManager 类监视系统对话框,但自LOLIPOP 以来该API 已被弃用。
出于这些原因,我建议您在叠加层中添加一个暂停按钮。或者更好的是,使用带有停止/开始按钮的粘性notification,以便用户可以手动暂停您的叠加层。
要识别系统应用程序,您需要包名称,如 this answer 中所述:
public boolean isSystemApp(String packageName)
try
// Get packageinfo for target application
PackageInfo targetPkgInfo = mPackageManager.getPackageInfo(
packageName, PackageManager.GET_SIGNATURES);
// Get packageinfo for system package
PackageInfo sys = mPackageManager.getPackageInfo(
"android", PackageManager.GET_SIGNATURES);
// Match both packageinfo for there signatures
return (targetPkgInfo != null && targetPkgInfo.signatures != null && sys.signatures[0]
.equals(targetPkgInfo.signatures[0]));
catch (PackageManager.NameNotFoundException e)
return false;
【讨论】:
我会检查链接...当某些用户选择的列入黑名单的应用程序位于前台时,我的应用程序有时会自行暂停,因此我通过ActivityManager
(或更新的 AccessibilityService
) 反正已经...我认为至少有AccessibilityService
的解决方案...
@prom85 是的,AccessibilityService#getWindows() 也有可能,根据文档返回显示的所有窗口。
通知里已经有暂停/恢复按钮了...而且获取当前前台应用/视图也没有问题,仍然不知道如何识别系统窗口...我已经为我与AccessibilityService
解决方案相关的问题添加了一些额外的信息...
我用更多信息更新了我的答案。使用包名或应用的ApplicationInfo判断应用是否为系统应用。
这意味着,只要系统应用程序在前面,我的应用程序就会被禁用(当您显示设备设置时,运行预安装的系统应用程序,例如 facebook/google/gmail,因为它们是作为系统安装的应用程序有时以及更多)...这不起作用...我只需要识别系统对话框窗口,无论哪个应用程序正在启动它...以上是关于检测到屏幕覆盖 - 如何在屏幕覆盖应用程序中处理此问题的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖