两件事。首先,当您设置辅助功能服务信息时,我建议您这样做:
AccessibilityServiceInfo info = getServiceInfo();
//Set things in here
setServiceInfo(info);
现在,这不会解决此问题。但是,这是一个很好的做法。您不想从服务配置XML中核实所有设置。此外,还有一些初始化选项以及在Android系统为您初始化信息对象的情况下难以正确设置的内容。只需抓住当前的一个,根据自己的喜好调整它,然后重置。实际上,我看不到可以在service_config xml文件中编辑的更改。使用服务XML配置,这是一个更好的整体实践!
现在,你遇到的问题是你的配置是错误的。注意eventTypes
是一个位掩码。这意味着,在下面一行:
asi.eventTypes = AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED;
你是说只听了WINDOW_STATE_CHANGED
事件。这很愚蠢。我喜欢做的是设置为TYPE_ALL_MASK,直到我确切知道哪些通知会触发我想要的事件。然后过滤掉。您还可以使用TYPE_ALL_MASK并使用switch语句进行过滤,并且如果您正在监听广泛不同的事件,则这最终是必需的,因为不同的事件会填充不同的信息(EX:并非所有事件都有源节点信息)。
现在,为什么类型,您正在使用的事件不工作:
TYPE_NOTIFICATION_STATE_CHANGED:此事件在增加了新的通知,而不是当你通知窗口向下滚动。
TYPE_WINDOW_STATE_CHANGED:当一个视图占用整个屏幕并且期望在允许访问背景内容之前进行交互时,会触发此事件。比如模态对话,菜单等。这个定义非常粗略,并且不一致。我相信后端最终会触发这一点的是绘制任何需要“SYSTEM_ALERT_VIEW”权限的视图,而不是我给出的定义。但是,这个定义是意图...是的,Android的可访问性文档很糟糕。
所以,现在我们知道了这个问题。我建议A:不使用代码来配置您的服务信息,B:使用TYPE_ALL_MASK观察所有事件,并找出哪些事件最始终一致。如果您观看所有事件,当通知栏向下滚动时,您可能会看到许多可访问性事件触发。选择一个最可靠的/发生在oppurtune时刻为你(EX:有些可能会在所有内容呈现之前触发......),然后为此过滤。
这就是我要开始的地方。
的AndroidManifest.xml服务配置:
<service
android:name=".A11yService"
android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" >
<intent-filter>
<action android:name="android.accessibilityservice.AccessibilityService" />
</intent-filter>
<meta-data
android:name="android.accessibilityservice"
android:resource="@xml/service_config" />
</service>
service_config XML文件:
<?xml version="1.0" encoding="utf-8"?>
<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
android:description="@string/accessibility_service_description"
android:accessibilityEventTypes="typeAllMask"
android:accessibilityFlags="flagIncludeNotImportantViews|flagReportViewIds"
android:canRetrieveWindowContent="true"
android:canRequestTouchExplorationMode="true"
android:accessibilityFeedbackType="feedbackSpoken"
android:notificationTimeout="100"
android:settingsActivity="com.deque.accessibilityanalyzer.SettingsActivity"
/>
太谢谢你了! – Walter