检索文本中的粗体字符串

时间:2017-10-11 11:06:03

标签: android

我遇到了一个小问题。我从权限窗口中检索了文本。

现在我找到了一种检索应用名称的方法。我就这样做了:

private String Namer(String parse){
        if(parse.length() > 30) {
            parse = parse.substring(parse.indexOf("********") + 6, parse.length());
            parse = parse.substring(0, parse.indexOf("*******"));
            return parse;
        } else {
            return parse;
        }
}

这就是我使用它的方式:

List<AccessibilityNodeInfo> NodeInfo;
    AccessibilityNodeInfo nodeInfo = event.getSource();
    for (Map.Entry<OriginalPermissions, String> permissions : 

detect.entrySet()) {
       NodeInfo = nodeInfo.findAccessibilityNodeInfosByText(permissions.getValue());


    Log.d("Information", Namer(Namer(String.valueOf(NodeInfo))));
}

但问题是权限窗口文本可能不同。有什么方法可以从权限窗口中检索粗体文本吗?

由于

1 个答案:

答案 0 :(得分:3)

如您所见(source code),GrantPermissionsActivity的标题是Spanned文字。而是依赖于周围的文本,您可以使用这样的方法获得第一个跨度(带粗体文本)的值:

public String getFirstSpanValueFromTitle(Spanned text) {
    StyleSpan[] spans = text.getSpans(0, text.length(), StyleSpan.class);
    if (spans.length > 0) {
        int start = text.getSpanStart(spans[0]);
        int end = text.getSpanEnd(spans[0]);
        return String.valueOf(text.subSequence(start, end));
    }
    return "";
}

否则,您需要获取每种语言的permission_warning_template资源字符串的值,并在代码中对其进行硬编码。

<强>更新

如何从AccessibilityEvent对象获取标题文本的示例:

String pkgName = event.getPackageName().toString();
if ("com.google.android.packageinstaller".equals(pkgName)) {
    AccessibilityNodeInfo root = event.getSource();
    List<AccessibilityNodeInfo> nodes = 
            root.findAccessibilityNodeInfosByViewId("com.android.packageinstaller:id/permission_message");
    if (nodes.size() > 0) {
        Log.e(TAG, "First span value: " + getFirstSpanValueFromTitle((Spanned) nodes.get(0).getText()));
    }
}