2016-07-31 119 views
10

某些设备具有额外的安全功能,并在显示权限对话框时检查应用程序是否在其他设备上绘图。检测到屏幕覆盖 - 如何在屏幕覆盖应用程序中处理此问题

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

问题

  • 我应该怎么来处理这种情况?
  • 有没有办法监听“系统对话框显示”事件,以便我可以删除我的侧栏和“系统对话框已完成”,以便我知道,我可以继续使用我的侧栏覆盖?我知道,这足以停止服务(您不必删除的权限),那么这将是一个解决方案,以及

编辑

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

使用AccessibilityService来检查当前的前景应用程序/视图。在那里,我将能够检查事件告诉我当前的前景活动,甚至意见...

我的问题:

  • 我不知道如何识别权限对话框出现。其次,这迫使我要求用户获得这个权限(我想避免这种权限,但有了这个服务的解决方案,对我来说已经是一种改进,因为有些用户已经给我的应用授予了这个权限 - 我将不得不问,然后解释原因,这是我可以生活的东西)。

回答

0

据我所知,你想要的是不可能的。在类似的question中,有一个检测系统对话框的解决方案,但我认为它不适用于覆盖(仅适用于当前活动的活动)。

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

由于这些原因,我建议您在叠加层上添加一个暂停按钮。或者更好,使用粘滞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; 
    } 
} 
+0

我查一下...我的应用程序暂停本身有时已经链接,当一些用户选择黑名单应用程序在前台,所以我通过'ActivityManager'(或更新的'AccessibilityService')监视这个事情......我想可能有一个解决方案,使用AccessibilityService'至少... – prom85

+0

@ prom85是的,它也可以使用[AccessibilityService#getWindows()](https://developer.android.com/reference/android/accessi bilityservice/AccessibilityService。html#getWindows()),它根据文档返回显示的所有窗口。 – Manu

+0

我已经有通知中的暂停/继续按钮...并且获取当前的前景应用程序/视图没有问题,但我仍然不知道如何识别系统窗口...我添加了一些额外的信息我的问题涉及到'AccessibilityService'解决方案... – prom85