获取 Android AccessibilityNodeInfo 的提示文本

Get hint text of Android AccessibilityNodeInfo

我正在使用 AccessibilityService 来抓取其他应用程序或浏览器中的字段。 为了获取字段的文本,我有以下代码片段:

AccessibilityNodeInfo node;

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

但是这个,在某些字段中,特别是在浏览器中,如果它是空的,给我字段的提示文本,我不能从提示值中排除文本值。

我知道 Android 哦,我们将为此提供 AccessibilityNodeInfo.getHintText(),这很酷,但我需要在 Android.[=18 的早期版本中使用我的应用程序=]

有人能解决我的情况吗?!

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

/** 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(); 行(在我清除该字段后)给我该字段的提示文本,或者空值,我的问题就解决了。

有人看到我上面的代码片段有什么问题吗?!

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

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

乙:放弃。

对编辑的回答:

我理解你的沮丧。 Android 辅助功能 API 非常糟糕。然而,你实际上不能做你想做的事。不在无障碍服务内。这绝对是平台限制。

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

而 EditText 的 accessibilityNodeInfo "Text" 属性 将是:

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

  • 输入的文字不是。

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

不幸的是,如果这不起作用,则没有其他属性可用于获取此信息 (< Android O)。有时开发人员使用 "contentDescription" 来存储类似的信息,但即使这样也不是 "ideal",因为 TalkBack 在这种情况下非常困难。

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