如果没有TextView,如何从accessibilityService读取内容?

时间:2017-02-14 09:18:51

标签: android accessibilityservice

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

我知道有可能提取,因为谷歌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"/>

提前致谢

1 个答案:

答案 0 :(得分:0)

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