使用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启动相同的区域开始您的服务。