检测到屏幕叠加 - 如何在屏幕叠加应用中处理此问题

pro*_*m85 10 permissions android overlay

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

我有一个侧边栏应用程序,我的应用程序必须被禁用,然后用户才能接受系统对话框.

问题

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

编辑

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

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

我的问题:

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

Com*_*Guy 0

据我所知,你想要的东西是不可能的。在类似的问题中,有一个解决方案可以检测系统对话框,但我认为它不适用于您的叠加层(仅适用于当前活动的活动)。

另一个问题表明,可以通过ActivityManager类监视系统对话框,但该 API 自 LOLIPOP 以来已被弃用。

出于这些原因,我建议您在叠加层中添加一个暂停按钮。或者更好的是,使用带有停止/启动按钮的粘性通知,以便用户可以手动暂停您的覆盖。


要识别系统应用程序,您需要包名称,如本答案中所述:

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;
    }
}
Run Code Online (Sandbox Code Playgroud)