我正在尝试在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
。