Android 使用AccessibilityService从(Facebook)RecyclerView读取文本

Android 使用AccessibilityService从(Facebook)RecyclerView读取文本,android,facebook,android-recyclerview,accessibility,android-accessibility,Android,Facebook,Android Recyclerview,Accessibility,Android Accessibility,如何查看非重点回收查看子项(项目)的文本? 我的辅助功能服务应该从包含关键字的屏幕中读取文本。这在大多数情况下都能很好地工作,除了我处理RecyclerViews的情况,尤其是在Facebook应用程序中 Facebook的feed和comments屏幕都基于RecyclerView,似乎都不能让我从他们的可访问性事件中获得所需的文本 我所尝试的: public void onAccessibilityEvent(AccessibilityEvent event) { //I've t

如何查看非重点回收查看子项(项目)的文本?

我的辅助功能服务应该从包含关键字的屏幕中读取文本。这在大多数情况下都能很好地工作,除了我处理RecyclerViews的情况,尤其是在Facebook应用程序中

Facebook的feed和comments屏幕都基于RecyclerView,似乎都不能让我从他们的可访问性事件中获得所需的文本

我所尝试的:

public void onAccessibilityEvent(AccessibilityEvent event) {

    //I've tried looping through event.getText() and it does not contain the text entries

    //I've also tried the following (with various null checks)
    AccessibilityRecordCompat record = AccessibilityEventCompat.asRecord(event);
    AccessibilityNodeInfoCompat source = record.getSource();
    List<AccessibilityNodeInfoCompat> nodes = source.findAccessibilityNodeInfosByText("...");
    //(and loop through the entries)

    //I've also tried limiting to the class name "android.support.v7.widget.RecyclerView"
    //and looking at parcelableData

    //In the facebook app, the following is always null too
    source.findFocus(AccessibilityNodeInfoCompat.FOCUS_ACCESSIBILITY);

}
我也尝试过探索源代码的子级,但是只显示视图组(没有视图),并且始终使用文本null

Ancestor for 0 = android.view.accessibility.AccessibilityNodeInfo@800a418a; boundsInParent: Rect(0, 0 - 1056, 236); boundsInScreen: Rect(12, 244 - 1068, 480); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]
Ancestor for 0, 0 = android.view.accessibility.AccessibilityNodeInfo@800a3647; boundsInParent: Rect(0, 0 - 1056, 236); boundsInScreen: Rect(12, 244 - 1068, 480); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: true; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_LONG_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]
Ancestor for 0, 0, 0 = android.view.accessibility.AccessibilityNodeInfo@800a3a08; boundsInParent: Rect(0, 0 - 828, 58); boundsInScreen: Rect(204, 262 - 1032, 320); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: true; longClickable: true; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_CLICK - null, AccessibilityAction: ACTION_LONG_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]
Ancestor for 0, 0, 0, 0 = android.view.accessibility.AccessibilityNodeInfo@800a454b; boundsInParent: Rect(0, 0 - 268, 58); boundsInScreen: Rect(204, 262 - 472, 320); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: true; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]
Ancestor for 0, 0, 1 = android.view.accessibility.AccessibilityNodeInfo@800a3dc9; boundsInParent: Rect(0, 0 - 828, 48); boundsInScreen: Rect(204, 320 - 1032, 368); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: true; longClickable: true; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_CLICK - null, AccessibilityAction: ACTION_LONG_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]
Ancestor for 0, 0, 2 = android.view.accessibility.AccessibilityNodeInfo@800a490c; boundsInParent: Rect(0, 0 - 828, 80); boundsInScreen: Rect(204, 382 - 1032, 462); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: false; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]
Ancestor for 0, 0, 2, 0 = android.view.accessibility.AccessibilityNodeInfo@800a4ccd; boundsInParent: Rect(0, 0 - 93, 44); boundsInScreen: Rect(507, 394 - 600, 438); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: true; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]
Ancestor for 0, 0, 2, 1 = android.view.accessibility.AccessibilityNodeInfo@800a508e; boundsInParent: Rect(0, 0 - 114, 44); boundsInScreen: Rect(632, 394 - 746, 438); packageName: com.facebook.katana; className: android.view.ViewGroup; text: null; error: null; maxTextLength: -1; contentDescription: null; viewIdResName: null; checkable: false; checked: false; focusable: false; focused: false; selected: false; clickable: true; longClickable: false; contextClickable: false; enabled: true; password: false; scrollable: false; actions: [AccessibilityAction: ACTION_SELECT - null, AccessibilityAction: ACTION_CLEAR_SELECTION - null, AccessibilityAction: ACTION_CLICK - null, AccessibilityAction: ACTION_ACCESSIBILITY_FOCUS - null, AccessibilityAction: ACTION_SHOW_ON_SCREEN - null]

我不确定这是否绝对可行,或者我可能采取了完全错误的方法。我注意到,在对讲模式下,用户必须在阅读RecyclerView子元素之前单击/聚焦这些元素,这不是我的服务选项(应该查找那些感兴趣的项目)

我遇到了嵌套滚动视图的问题,我想通过递归查找所有视图解决了这个问题,你已经试过了。这是我的解决方案,你可以试试,它可能也对你有用

private AccessibilityNodeInfo accessbiltyContent(AccessibilityNodeInfo parentView,String strAddress) throws Exception {

    int childCount = parentView.getChildCount();


    for (int i = 0; i < childCount; ++i) {
        AccessibilityNodeInfo child = parentView.getChild(i);
        // child=null;
        if (child != null) {

            String strToAddress=strAddress+" > "+child.getClassName().toString();
            String nodeText="";

            if(child.getText() != null)
                nodeText=child.getText().toString();


            Log.v(TAG,"values =" +child.getClassName().toString(),nodeText,strToAddress));
            accessbiltyContent(child,strToAddress);

        }
        else {
            return null;
        }
    }

    return null;


}
private AccessibilityNodeInfo AccessibilityContent(AccessibilityNodeInfo父视图,字符串StradAddress)引发异常{
int childCount=parentView.getChildCount();
对于(int i=0;i”+child.getClassName().toString();
字符串nodeText=“”;
if(child.getText()!=null)
nodeText=child.getText().toString();
Log.v(标记,“values=“+child.getClassName().toString(),nodeText,strotAddress));
accessbiltyContent(子项、strToAddress);
}
否则{
返回null;
}
}
返回null;
}

它将遍历父视图中的所有视图并打印它们以查找。

是的,这没有任何作用-文本节点都将为空。它基本上与生成上一组日志的代码相同question@Mamidi阿尼尔·库马尔:你有没有尝试过使用无障碍API从FB获取帖子,你能获取帖子文本吗?我还有23个小时就这个问题悬赏。如果有人有一个模糊的想法可以帮上忙,我很想看看你们在解决方案方面有什么进展吗?我没有,抱歉,但我们正在从其他RecyclerView获取文本,将自定义xml(文本视图)作为行,用于其他应用程序中…所以如果你们找到了解决方案,请确保将其发布到这里,供其他读者阅读
private AccessibilityNodeInfo accessbiltyContent(AccessibilityNodeInfo parentView,String strAddress) throws Exception {

    int childCount = parentView.getChildCount();


    for (int i = 0; i < childCount; ++i) {
        AccessibilityNodeInfo child = parentView.getChild(i);
        // child=null;
        if (child != null) {

            String strToAddress=strAddress+" > "+child.getClassName().toString();
            String nodeText="";

            if(child.getText() != null)
                nodeText=child.getText().toString();


            Log.v(TAG,"values =" +child.getClassName().toString(),nodeText,strToAddress));
            accessbiltyContent(child,strToAddress);

        }
        else {
            return null;
        }
    }

    return null;


}