获取Android AccessibilityNodeInfo的提示文本

时间:2017-06-19 07:05:50

标签: android accessibilityservice

我正在使用AccessibilityService抓取其他应用或浏览器中的字段。 要获取字段文本,我在下面的代码段中有以下代码:

AccessibilityNodeInfo node;

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

但是,在某些领域,特别是在浏览器中,如果它是空的,请给我字段的提示文本,并且我不能从提示值中提取文本值。

我知道在Android O中,我们会有AccessibilityNodeInfo.getHintText(),这很酷,但我需要在之前版本的Android中使用我的应用。

有没有人解决我的病情?!

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

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

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

1 个答案:

答案 0 :(得分:1)

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

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

B:放弃。

回答编辑:

我理解你的沮丧。 Android Accessibility API非常糟糕。但是,你实际上无法做你想做的事情。不属于辅助功能服务。这绝对是一个平台限制。

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

和EditText的accessibilityNodeInfo" Text"财产将是:

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

  • 输入的文字不是。

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

不幸的是,如果这不起作用,则没有其他属性可用于获取此信息(< Android O)。有时开发人员使用" contentDescription"存储类似的信息,但即使这不是理想的#34;因为TalkBack非常难以扼杀这种情况。

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