兩件事。首先,當您設置輔助功能服務信息時,我建議您這樣做:
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