【问题标题】:Using Android AccessibilityService.getWindows() to get a list of View elements on screen使用 Android AccessibilityService.getWindows() 获取屏幕上的 View 元素列表
【发布时间】:2017-10-31 16:22:29
【问题描述】:

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

我不是想构建一个完整的 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() 的文档/示例。

【问题讨论】:

  • 为了根据屏幕内容优化行为,accessibilityservice 应用程序是否可以访问原始显示像素图以及收到通知弹出窗口的通知?

标签: android window android-view accessibilityservice


【解决方案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 的同一区域启动您的服务,方法是打开您的服务的开关。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 2018-05-22
    • 2013-03-20
    • 1970-01-01
    • 2011-08-15
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多