对于使用SYSTEM_ALERT_WINDOW的服务,请避免检测到屏幕覆盖

时间:2016-11-07 22:16:39

标签: android android-permissions system-alert-window

我的应用主要用途是叠加层,叠加层是从服务运行的。

Android安全性添加了不错的"Screen Overlay Detected"

当用户尝试更改权限时,我想避免“检测到屏幕覆盖”。所以......我添加了一个检测到的AccessiblityService:

if ( event.getPackageName().equals("com.google.android.packageinstaller") ){
    stopService(myServiceIntent);
}

然而,即使是现在我也看到这个消息弹出。 (当我的服务停止时......)。

我看到Twilight没有问题。

我错过了什么?

P.S。 - 我也尝试构建一个签名的apk但看到完全相同的行为。

2 个答案:

答案 0 :(得分:1)

我似乎已经解决了这个问题。

a)停止服务不能保证您的服务将被停止。 如上所述here

  

除非删除所有这些绑定,否则不会销毁它。见>有关服务生命周期的更多详细信息,请参阅服务文档。

b)我能够通过发送名为stopSelf()的意图来终止我的服务。 但是,进程终止可能很慢。

c)最佳分辨率:所以Android似乎检查视图可见性。不需要杀死服务或做任何更复杂的事情。

目前我正在这样做: - AccessibilityService(已被我的应用程序使用)监视“com.google.android.packageinstaller”,虽然它可以改进为类:“com.android.packageinstaller.permission.ui.ManagePermissionsActivity”

  • 在本课程中检测到,我们将意图发送到“鸭子”,当我们离开时,我们发送另一个我们重新开启的意图。

  • 该服务通过以下方式处理这些调用:

    [ourView].setVisibility(View.INVISIBLE); // when permission settings shown

    [ourView].setVisibility(View.VISIBLE); // when normal flow

答案 1 :(得分:0)

只要Android 6.x在一些没有任何理由显示“覆盖警报”的设备上出现问题(根据我的分析数据,在2%到5%的设备上),最好的解决方案是避免整个通过将targetSdk定义为22来进行权限处理。请注意,不能将目标sdk降级为新版本,否则当用户更新需要unisntall /安装应用程序时,这将导致INSTALL_FAILED_PERMISSION_DOWNGRADE错误。