gpt4 book ai didi

android - AccessibilityNodeInfo.ACTION_CLICK 不工作

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

所以我是新手,一直在玩弄 onAccessibilityEvent 并阅读来自其他应用程序屏幕上的 TextViews,它运行良好,但现在我想能够使用 AccessibilityNodeInfo.ACTION_CLICK 来点击其中的一些。我的问题是其他应用程序中的大多数 TextView 都没有打开可点击功能,但它们有一个弹出窗口位于 android.widget.LinearLayoutandroid.widget.FrameLayout 可点击。但我的代码似乎并没有点击它们。有什么建议吗?

public class AutoService extends AccessibilityService 
{
@TargetApi(16)
@Override
public void onAccessibilityEvent(AccessibilityEvent event)
{
AccessibilityNodeInfo source = event.getSource();
myAdapter.processEvent(source);
}
}

public class myAdapter
{
public static void processEvent(final AccessibilityNodeInfo source)
{
final StringBuilder sb = new StringBuilder();
processSubEvent(source, 0, sb);
final String string = sb.toString();

if (string == null)
{
return;
}

clickScreen(source, string.toLowerCase());
}

private static void processSubEvent(final AccessibilityNodeInfo source, final int n, final StringBuilder sb) {
for (int i = 0; i < n; ++i) {
sb.append("\t");
}

if (source != null)
{
sb.append(source.getText());
sb.append("\n");
final int childCount = source.getChildCount();

for (int i = 0; i < childCount; i++)
{
AccessibilityNodeInfo child = source.getChild(i);
processSubEvent(child, n + 1, sb);

if (child != null)
{
child.recycle();
}
}
}
}

private static void clickScreen(final AccessibilityNodeInfo source, final String text)
{
List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText(text);

for (final AccessibilityNodeInfo node : list)
{
node.performAction(AccessibilityNodeInfo.ACTION_CLICK);
}
}
}

最佳答案

我认为您同意我的看法,问题出在:

List<AccessibilityNodeInfo> list = source.findAccessibilityNodeInfosByText(text); 

as this method returns a "List", may come to mind at first glance that it returns all the nodes which mentioned in this string. In fact, it scans the string and returns all the nodes that contains, not a part, but the whole string.

在您的程序中,给“clickScreen”的字符串包含所有 View 的文本。因此,您可以:

  • 每当您通过以下方式与其中一位会面时单击 View :

    if(child.isClickable()){
    child.performAction(AccessibilityNodeInfo.ACTION_CLICK);
    }

    如果你想点击一个特定的 View ,你必须事先知道它的文本或部分内容(注意“确定”和“取消”,因为它会关闭屏幕):

    child.getText().toString().toLowerCase().contains()("your text");
  • 或者把它们都放在ArrayList中,然后点击你想要的:

    1. 填充ArrayList:

      //create new ArrayList
      public ArrayList<AccessibilityNodeInfo> clickableViews = new ArrayList<>();

      private static void processSubEvent(final AccessibilityNodeInfo source, final int n, final StringBuilder sb) {
      ...
      if (child != null)
      {
      //fill the ArrayList with clickable views(make sure to put the origin reference because you will recycle child later)
      if(child.isClickable()) {
      clickableViews.add(source.getChild(i));
      }
      ...
      }
    2. 迭代列表并点击:

       for (AccessibilityNodeInfo view : clickableViews) {
      //We only want to click one view per function call! Clicking multiple
      //views in rapid succession is error prone and functionally ambiguous
      //meaning it might work in some use cases, and throw exceptions in others.
      if(view.performAction(AccessibilityNodeInfo.ACTION_CLICK)) break;
      }

关于android - AccessibilityNodeInfo.ACTION_CLICK 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45529604/

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