2017-10-14 177 views
0

引用setServiceInfo的文檔 「您可以隨時調用此方法,但在系統綁定到此服務並且此方法爲之後稱之爲「。AccessibilityService setServiceInfo方法的更改在服務連接外似乎不起作用

對我的應用程序啓用了輔助功能,並且我已經在onServiceConnected方法中設置了serviceInfo,並且正在接收這些應用程序的事件,並且一切正常。

現在,問題是我試圖通過在onServiceConnected方法外調用setServiceInfo來修改程序包列表,但是這些更改沒有生效(即,我仍然從前面指定的程序包列表中的程序包接收事件這些在修改的軟件包列表中不存在)。

@Override 
protected void onServiceConnected() { 
    AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); 
    accessibilityServiceInfo.packageNames = new String[]{"packageA","packageB"}; 
    accessibilityServiceInfo.eventTypes = AccessibilityEvent.TYPE_VIEW_CLICKED | AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED 
      | AccessibilityEvent.TYPE_VIEW_SCROLLED | AccessibilityEvent.TYPE_VIEW_TEXT_CHANGED 
      | AccessibilityEvent.TYPE_VIEW_FOCUSED | AccessibilityEvent.TYPE_VIEW_SELECTED 
      | AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED; 
    accessibilityServiceInfo.feedbackType = AccessibilityServiceInfo.FEEDBACK_GENERIC; 
    accessibilityServiceInfo.notificationTimeout = 100; 
    accessibilityServiceInfo.flags = (AccessibilityServiceInfo.FLAG_REPORT_VIEW_IDS | accessibilityServiceInfo.flags); 
    setServiceInfo(accessibilityServiceInfo); 
} 

@Override 
public void onAccessibilityEvent(final AccessibilityEvent event) { 
    AccessibilityServiceInfo serviceInfo = getServiceInfo(); 
    serviceInfo.packageNames = new String[]{"packageA"}; 
    setServiceInfo(serviceInfo); 
} 

accessibility_service_config.xml

<accessibility-service 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:canRetrieveWindowContent="true" 
    android:description="@string/accessibility_service_description" 
/> 

所以,問題是如何添加/刪除軟件包的輔助服務,內視我後來收到的可訪問性事件?

回答

1

您不能通過將軟件包名稱添加到該列表來排除軟件包名稱。

serviceInfo.packageNames = null 

獲取所有包的事件。

serviceInfo.packageNames = {"some.package"} 

只爲some.package獲取事件。這個清單不是排除的,它只是一個僅包含的內容清單。

現在,如果你可以保留你想獲取事件的所有包的列表,你可以這樣做。動態設置服務信息只是很漂亮!但是,TBH,你這樣做太困難了,沒有按照預期的方式使用這個API。如果你只想排除一些事情,建議保存世界上所有其他包名的列表,以獲得他們的事件。在我看來,你需要你自己的邏輯過濾器軟件包名稱。我反而試試這個:

@Override 
public void onAccessibilityEvent(AccessibilityEvent e) { 

    //Do the filtering yourself. 
    ArrayList<String> includedPackageNames = youlist; 

    if (!includedPackageNames.contains(e.getPackageName())) return; 

    //Do the rest of your stuff here. 
} 

編輯:

你有一些問題與您的服務信息的東西。當你做這行:

@Override 
protected void onServiceConnected() { 
    AccessibilityServiceInfo accessibilityServiceInfo = new AccessibilityServiceInfo(); //This one! 
    ... 
} 

您覆蓋所有的在你的service_config.xml文件中的信息以及你沒在那裏設置任何缺省值。您應該讓service_config.xml處理您的靜態初始化,並且只通過修改獲取的serviceInfo對象來進行動態更改。或者,至少從您的服務配置中獲取已經構建的那個。

把上面一行是:

//Get the object that has been initialized with settings from your service_config.xml file 
AccessibilityServiceInfo accessibilityServiceInfo = getServiceInfo(); 

,或者更好的,刪除整個onServiceConnected功能,並在service_config.xml文件做這一切靜態。

+0

也許我不是很清楚,當我說「排除」。讓我解釋。最初我想接收兩個包「packageA」和「packageB」的事件,我使用setServiceInfo在onServiceConnected中設置。稍後在收到某個事件後,我想「排除」packageB,並只想要packageA中的事件。現在我修改packageNames數組,只包含packageA並再次調用setServiceInfo,但我仍然收到來自packageB.的事件。我目前使用的是你建議的方式,但我想了解爲什麼即使打擾從packageB接收事件並返回,如果我可以取消訂閱PackageB 。 –

+0

編輯該問題以避免含糊不清。 –

+0

你會遇到所有這些麻煩,從你的代碼中刪除一個「if」語句?所以,你提供的代碼沒有任何問題。這一切都應該假設工作,所以在你的代碼或Android中有一個錯誤。我有興趣看到你通過評論而省略的代碼,並且在初始化初始化服務信息時揮手致意。也就是說,這絕對是該API的非標準使用,所以不要打折你可能在Android中發現錯誤的事實。 – ChrisCM