2017-05-31 39 views
0

是否可以使用AccessibilityService.getWindows()獲取當前在屏幕上顯示的View元素列表,包括其Z級別一個是最頂層的元素,以及它們所屬的包名稱?如果是這樣,怎麼樣?我不想構建一個完整的AccessibilityService,我只對getWindows()方法感興趣,以獲得屏幕上的窗口列表。我試了下面的代碼:使用Android AccessibilityService.getWindows()獲取屏幕上的View元素列表

AccessibilityService myService = new AccessibilityService() { 
    @Override 
    public void onAccessibilityEvent(AccessibilityEvent event) { 

    } 

    @Override 
    public void onInterrupt() { 

    } 
}; 
List<AccessibilityWindowInfo> windowList = myService.getWindows(); 
if (windowList.isEmpty()) { 
    Log.d(TAG, "Window list is empty"); 
} else { 
    Log.d(TAG, "Window list is not empty"); 
} 

但是,窗口列表總是空的。我確定我做錯了什麼,但我似乎無法找到任何有關使用getWindows()的文檔/示例。

謝謝。

回答

0

您不能通過這種方式實例化無障礙服務。無障礙服務可以親密地查看信息。允許他們從活動和其他課程開始活動將是一個非常嚴重的安全風險。您必須在系統中註冊您的無障礙服務,並從無障礙服務設置菜單啓動它。要做到這一點,你應該在你的manifest文件,看起來像這樣的條目:

<application 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name"> 

    <service 
     android:name=".MyAccessibilityService" 
     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> 

    <activity android:name=".MyServiceSettingsActivity" 
     android:label="@string/app_name"> 

     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 
      <category android:name="android.accessibilityservice.SERVICE_SETTINGS" /> 
     </intent-filter> 
    </activity> 
</application> 

隨着所謂的「service_config」一個原始的XML文件,其中包含這樣的東西:

<accessibility-service 
xmlns:android="http://schemas.android.com/apk/res/android" 
android:description="@string/accessibility_service_description" 
android:accessibilityEventTypes="typeAllMask" 
android:accessibilityFlags="flagReportViewIds" 
android:canRetrieveWindowContent="true" 
android:canRequestTouchExplorationMode="true" 
android:accessibilityFeedbackType="feedbackSpoken" 
android:notificationTimeout="100" 
android:settingsActivity="com.yourpackage.MyServiceSettingsActivity" 
/> 

然後你通過開啓您服務的開關,從與TalkBack啓動相同的區域開始您的服務。