gpt4 book ai didi

android - 如何在 android 中使用辅助功能服务获取 View ID

转载 作者:行者123 更新时间:2023-11-29 01:10:01 24 4
gpt4 key购买 nike

我是 android 的初学者。我想获取用户当前正在查看的 View 的 View ID。我让我的问题更清楚一点。假设用户打开 MakeMyTrip 并导航到航类预订页面。现在我想获取该特定布局的 View ID。下面是我的服务类和 xml 配置文件。

public class MyAccessibilityService extends AccessibilityService {
@Override
public void onAccessibilityEvent(AccessibilityEvent event) {

AccessibilityNodeInfo source = event.getSource();

Log.d("ViewID",source.getViewIdResourceName());


}

@Override
public void onInterrupt() {

}



<accessibility-service
xmlns:android="http://schemas.android.com/apk/res/android"
android:accessibilityEventTypes="typeWindowContentChanged"
android:accessibilityFeedbackType="feedbackGeneric"
android:accessibilityFlags="flagReportViewIds"
android:canRetrieveWindowContent="true"
android:description="@string/accessibility_service_description"
android:packageNames="com.makemytrip" />

最佳答案

我猜你调用

Log.d("ViewID",source.getViewIdResourceName());

正在这样做:

Log.d("ViewID", null)

window_content_changed 事件的源节点将成为其内容已更新的布局的根节点。这极不可能有 viewIDResourceName。大多数 View 没有资源名称,可通过直接访问 View 访问的 View ID 只是自动生成的哈希值,没有任何意义。只有具有实际 viewResourceNames 的 View 才会将其名称报告给无障碍服务。因此,如果该元素没有 R.id.viewResourceName,无障碍服务将为该值报告 null。 Android 日志实用程序无法记录空值,您至少必须给它一个空字符串。

你应该这样做。

String viewIdName = source.getViewIdResourceName();
Log.d("ViewID", (viewIdName != null) ? viewIdName : "NO VIEW ID");

值得注意的是,对于打印出来的位置,您总是会得到“NO VIEW ID”。您将不得不向下爬取 View 层次结构以找到具有资源名称的 View 。找到一些按钮或您已分配 ID 的东西!或者可能会监听不同类型的可访问性事件。不过要小心!并非所有事件都有源节点!所以,如果你听

android:accessibilityEventTypes="typeAllMask"

您还需要检查空源节点。或者你会得到不同类型的空指针异常。

编辑:用于记录整个可访问性节点 View 层次结构的基本递归函数。

    public static void logViewHierarchy(AccessibilityNodeInfo nodeInfo, final int depth) {

if (nodeInfo == null) return;

String spacerString = "";

for (int i = 0; i < depth; ++i) {
spacerString += '-';
}
//Log the info you care about here... I choce classname and view resource name, because they are simple, but interesting.
Log.d("TAG", spacerString + nodeInfo.getClassName() + " " + nodeInfo.getViewIdResourceName());

for (int i = 0; i < nodeInfo.getChildCount(); ++i) {
logViewHierarchy(nodeInfo.getChild(i), depth+1);
}
}

//Then call it like this from anywhere in your service, don't necessarily have to use the root node.
logViewHierarchy(getRootInActiveWindow(), 0);

关于android - 如何在 android 中使用辅助功能服务获取 View ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43834499/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com