【问题标题】:Get hint text of Android AccessibilityNodeInfo获取 Android AccessibilityNodeInfo 的提示文本
【发布时间】:2017-06-20 23:40:59
【问题描述】:

我正在使用AccessibilityService 在其他应用程序或浏览器中抓取字段。 为了获取字段的文本,我在下面有这个 sn-p 代码:

AccessibilityNodeInfo node;

text = node.getText().toString();

但是,在某些字段中,特别是在浏览器中,如果字段为空,则给我该字段的提示文本,并且我无法从提示值中删除文本值。

我知道在 Android O 中,我们将为此提供 AccessibilityNodeInfo.getHintText(),这很酷,但我需要在以前的 Android 版本中使用我的应用程序。

有人对我的情况有什么解决办法吗?!

***更新 我已经尝试过以下解决方案来实现我的目标:

/** Ummm, didn't work :( */
public static boolean isTextViewWithHint(AccessibilityNodeInfo node)
{
    boolean isHint;
    String text, hint;

    text = node.getText().toString();
    Log.d(TAG, "text = " + text);

    Bundle arguments = new Bundle();
    arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, "");
    node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments);

    Log.d(TAG, "node.refresh() = " + node.refresh());

    hint = node.getText().toString();
    Log.d(TAG, "hint = " + hint);

    if (text != null && hint != null && text.equals(hint))
    {
        // current value of node is a Hint!
        Log.d(TAG, text + " is a Hint.");

        isHint = true;
    }
    else
    {
        Log.d(TAG, text + " is real value.");

        isHint = false;
    }

    Bundle arguments2 = new Bundle();
    arguments.putCharSequence(AccessibilityNodeInfo.ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text);
    node.performAction(AccessibilityNodeInfo.ACTION_SET_TEXT, arguments2);

    return isHint;
}

但这不起作用,因为当我清除该字段时,hint = node.getText().toString(); 仍然给我与text = node.getText().toString(); 之前给我相同的值!不知道为什么?!

如果hint = node.getText().toString(); 行(在我清除字段后)给了我字段的提示文本,或者空值,我的问题就解决了。

有人看到我上面的 sn-p 代码有什么问题吗?!

【问题讨论】:

  • 请不要降级我的问题:)!我问谁在 android 中与 AccessibilityService 一起工作过。另外,对不起我的英语。
  • 如果您将文本设置为 null 而不是空,您的“破解”解决方案可能会起作用。

标签: android accessibilityservice


【解决方案1】:

你不能这样做。在 Android O 之前,您完全无法使用它。您的选择:

A:使用媒体投影 API 和 OCR 来实际读取 EditText 字段中的提示文本。

B:放弃。

编辑回答:

我理解你的沮丧。 Android Accessibility API 非常糟糕。但是,您实际上无法做您想做的事情。不在无障碍服务范围内。这绝对是平台限制。

在 Android O 之前,以下是真实且不可更改的:

EditText 的accessibilityNodeInfo "Text" 属性将是:

  • 提示文本,当输入到 EditText 字段中的文本为空时。

  • 输入的文本不是。

我在您的破解解决方案中看到试图覆盖文本字段中的字符。鉴于上述情况,您可以尝试将文本设置为 (null) 而不是 ("")。

很遗憾,如果这不起作用,则没有其他属性可用于获取此信息(

问题是,开发人员不应该依赖“提示”文本来获取关键信息。他们应该将其 EditText 控件与可见标签相关联。

【讨论】:

  • 这是平台限制。你真的不能做你想做的事。在 Android O 之前。如果您想了解更多信息,请私下联系我。我的linkedIn 和凭据在我的个人资料中。
  • 你没有权限放弃?无知所产生的需求是使事情变得更糟的黑客解决方案的秘诀! :)
  • 将文本设置为 (null) 没有帮助。无论如何,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2014-10-09
  • 2020-12-16
  • 1970-01-01
  • 2020-02-10
  • 2010-11-22
  • 1970-01-01
相关资源
最近更新 更多