获取 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 控件与可见标签相关联。
我正在使用 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 控件与可见标签相关联。