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

使用Android AccessibilityService.getWindows()获取屏幕上的视图元素列表,android,window,android-view,accessibilityservice,Android,Window,Android View,Accessibilityservice,是否可以使用AccessibilityService.getWindows()获取当前显示在屏幕上的视图元素的列表,包括它们的Z级别、哪个元素是最上面的元素以及它们所属的包名?如果是,怎么做 我不想构建一个全面的AccessibilityService,我只对getWindows()方法感兴趣,它可以在屏幕上获取窗口列表。我尝试了以下代码: AccessibilityService myService = new AccessibilityService() { @Override pu

是否可以使用AccessibilityService.getWindows()获取当前显示在屏幕上的视图元素的列表,包括它们的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");
}
AccessibilityService myService=new AccessibilityService(){
@凌驾
AccessibilityEvent上的公共无效(AccessibilityEvent事件){
}
@凌驾
在中断时的公共无效(){
}
};
List windowList=myService.getWindows();
if(windowList.isEmpty()){
Log.d(标记“窗口列表为空”);
}否则{
Log.d(标记“窗口列表不为空”);
}

但是,窗口列表始终为空。我肯定我做错了什么,但我似乎找不到任何关于使用
getWindows()

的文档/示例。您不能以这种方式实例化辅助功能服务。易访问性服务可以方便地查看信息。允许他们随意从活动和其他类开始将是一个非常严重的安全风险。您必须向系统注册辅助功能服务,并从辅助功能服务设置菜单启动它。为此,您的清单文件中应该有一个如下所示的条目:

<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>
<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"
/>

以及一个名为“service_config”的原始xml文件,该文件包含以下内容:

<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>
<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"
/>


然后,通过打开服务开关,从启动对讲的同一区域启动服务

您不能以这种方式实例化辅助功能服务。易访问性服务可以方便地查看信息。允许他们随意从活动和其他类开始将是一个非常严重的安全风险。您必须向系统注册辅助功能服务,并从辅助功能服务设置菜单启动它。为此,您的清单文件中应该有一个如下所示的条目:

<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>
<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"
/>

以及一个名为“service_config”的原始xml文件,该文件包含以下内容:

<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>
<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"
/>


然后,通过打开服务开关,从启动对讲的同一区域启动服务

为了根据屏幕内容进行最佳操作,accessibilityservice应用程序能否访问原始显示像素地图并获得通知弹出窗口?为了根据屏幕内容进行最佳操作,accessibilityservice应用程序是否可以访问原始显示像素地图并获得通知弹出窗口?