使用Android AccessibilityService.getWindows()获取屏幕上的View元素列表

问题描述:

是否可以使用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()的文档/示例。

谢谢。

您不能通过这种方式实例化无障碍服务。无障碍服务可以亲密地查看信息。允许他们从活动和其他课程开始活动将是一个非常严重的安全风险。您必须在系统中注册您的无障碍服务,并从无障碍服务设置菜单启动它。要做到这一点,你应该在你的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启动相同的区域开始您的服务。