我正在尝试在Android上的BBC新闻应用中阅读文章名称。我创建了一个accessibilityService来读取屏幕内容。我遍历找到的所有视图,并打印所有子视图可能使用的node.toString()和任何node.getText().toString()。我找不到任何带有文章名称的TextView

我知道它可以提取,因为Google TalkBack可以很好地读出文章。有谁知道它是如何隐藏的,我可以查看吗?

我的accessibilityService的设置如下所示

<accessibility-service xmlns:android="http://schemas.android.com/apk/res/android"
    android:accessibilityEventTypes="typeAllMask"
    android:accessibilityFeedbackType="feedbackGeneric"
    android:accessibilityFlags="flagDefault|flagReportViewIds"
    android:canRetrieveWindowContent="true"
    android:description="@string/service_description"
    android:notificationTimeout="1000"/>


提前致谢

最佳答案

JSONObject getTextViews(AccessibilityNodeInfo info)  {
  if(info!=null){
      JSONObject jsonObject = new JSONObject();
      try {
          jsonObject.put("Class:",""+info.getClassName());

      if(info.getClassName().equals("android.widget.TextView")){
           jsonObject.put("Text",""+info.getText());
         // Log.d("TextViews:", ""+info.getText());
          return jsonObject;
      }else {
          JSONArray array = new JSONArray();
         for(int i=0;i<info.getChildCount();i++){
            array.put(getTextViews(info.getChild(i)));
         }
         jsonObject.put("Child",array);
      }
      } catch (JSONException e) {
          e.printStackTrace();
      }

      return jsonObject;
  }else
      return null;
}


这是一个递归函数,用于以Json Hierarchy的形式获取前景窗口上的整个布局。只需通过root AccessibilityNodeInfo object。在服务的onAccessibilityEvent中调用此函数,然后使用EventType AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED

10-07 19:35