Android AccessibilityManager getEnabledAccessibilityServiceList在某些情况下返回空列表

时间:2015-08-20 08:56:09

标签: android service accessibility

我的应用扩展了Android的AccessibilityService,以监控当前有效的应用。为了检测活动的变化,我必须注册我的服务并让用户同意允许这些许可。为了方便用户,我检测我的应用程序启动时当前是否启用了我的服务,如果没有启用,例如安装应用程序后,我将用户重定向到“设置辅助功能”页面,以允许他们启用该服务。以下代码检查我的服务当前是否已启用,id参数是我的服务的id,例如com.foo.bar/.MyService语法:

private boolean isAccessibilityEnabled(String id) {
        AccessibilityManager am = (AccessibilityManager) getSystemService(Context.ACCESSIBILITY_SERVICE);
        List<AccessibilityServiceInfo> enabledServices = am.getEnabledAccessibilityServiceList(AccessibilityEvent.TYPES_ALL_MASK);
        for (AccessibilityServiceInfo service : enabledServices) {
            if (id.equals(service.getId())) {
                return true;
            }
        }
        return false;
    }

我已经看到两种情况,即使我知道该服务已启用,此检查也会失败。首先,如果我从Android Studio调试我的应用程序,则此操作失败并且enabledServices为空,如果我运行(而不是调试)它完美运行并返回enabledServices中的单个条目。我注意到失败的第二个场景是当我运行adb backup命令来备份我的应用程序时,如果我的应用程序当前可见,当备份提示出现时,则备份完成我的应用程序的主要活动{{1执行并检查onCreate方法,再次看不到我的服务已启用。

在调用isAccessibilityEnabled时是否需要考虑一个特殊情况,或者是否有理由不返回我的服务,即使我查看“辅助功能设置”页面时我可以看到服务 已启用。

1 个答案:

答案 0 :(得分:0)

有一种替代方法可以查询是否启用了辅助功能服务,我使用了here - Detect if my accessibility service is enabled所描述的方法,它似乎解决了我遇到的问题。