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

时间:2017-05-31 03:12:25

标签: android window android-view accessibilityservice

是否可以使用AccessibilityService.getWindows()来获取当前显示在屏幕上的View元素列表,包括它们的Z-level,哪一个是最顶层的元素,以及它们所属的包名称?如果是这样,怎么样?

我不是要构建一个完整的AccessibilityService,我只对getWindows()方法感兴趣,以获取屏幕上的窗口列表。我尝试了以下代码:

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()的任何文档/示例。

1 个答案:

答案 0 :(得分:1)

您无法以这种方式实例化辅助功能服务。辅助功能服务可以访问查看信息。允许他们从活动和其他课程开始不受欢迎将是一个非常严重的安全风险。您必须在系统中注册辅助功能服务,然后从辅助功能服务设置菜单中启动它。为此,您应该在清单文件中有一个类似于以下内容的条目:

<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的相同区域启动服务,方法是打开服务的开关。