我正在使用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();
行(在我清除字段后)给我提示字段的提示文本或空值,我的问题就会解决。
有人看到我上面的代码片段有任何问题吗?!
答案 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控件与可见标签相关联。