检测到屏幕覆盖 - 如何在屏幕覆盖应用程序中处理此问题

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 中检测不活动(无用户交互)以显示单独的屏幕,如覆盖

如何在 Nativescript 中制作覆盖屏幕 [关闭]

如果用户在显示通知时尝试授予权限,则 Android“检测到屏幕覆盖”消息

如何检测双高状态栏?

如何在Android和iPhone上拍摄占据整个屏幕的图像?