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

Dar*_*rst 5 service android 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;
    }
Run Code Online (Sandbox Code Playgroud)

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

呼叫时是否需要考虑一种特殊情况,getEnabledAccessibilityServiceList或者即使在“辅助功能设置”页面中看到可以看到该服务启用,为什么没有返回我的服务也有原因。

Dar*_*rst 2

还有另一种方法可以查询是否启用了辅助功能服务,我使用了此处描述的方法- 检测我的辅助功能服务是否已启用,它似乎可以解决我遇到的问题。