检测到屏幕覆盖 - 如何在屏幕覆盖应用

时间:2016-07-31 19:08:00

标签: android permissions overlay

某些设备具有额外的安全功能,并在显示权限对话框时检查应用是否在其他设备上绘图。

我有一个侧边栏应用,在用户接受系统对话框之前,我的应用必须被禁用。

问题

  • 我该如何处理这个案子?
  • 有没有办法收听“显示系统对话框”事件,这样我就可以删除侧栏和“完成系统对话框”,以便我知道,我可以继续使用侧边栏覆盖?我知道,这足以停止服务(你不必删除权限),所以这也是一个解决方案

修改

我能想到的一个解决方案如下:

使用AccessibilityService检查当前的前台应用/视图。在那里,我将能够检查向我展示当前前景活动甚至视图的事件......

我的问题:

  • 我不知道如何在那里识别权限对话框。
  • 其次,这迫使我要求用户获得此权限(我想要避免,但是使用此服务的解决方案,对我来说已经是一个改进,因为有些用户已经将此权限授予我的应用程序 - 我将不得不问所有人并解释原因,这是我可以忍受的事情)。

1 个答案:

答案 0 :(得分:0)

据我所知,你想要的是不可能的。在类似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;
    }
}