android.net.uri getQueryParameterNames()替代方案

Ton*_*uze 5 api parameters android uri

我正在寻找另一种从android.net.Uri获取查询参数名称的方法.getQueryParameterNames()需要api级别11.我想对任何低级api做同样的事情.我在看getQuery(),它会返回'?'之后的所有内容.标志.最好的解决方法是解析该字符串并在'='之前搜索所有内容并捕获它吗?我根本不知道每次都会呈现什么查询参数.

小智 12

API <11的唯一问题是该方法未实现.我想最好的办法是寻找到Android的源代码,并使用从API> = 11,实施这应该让你绝对同文功能,即使在旧的API.

这个是从4.1.1开始修改,以Uri作为参数,所以你可以立即使用它:

/**
 * Returns a set of the unique names of all query parameters. Iterating
 * over the set will return the names in order of their first occurrence.
 *
 * @throws UnsupportedOperationException if this isn't a hierarchical URI
 *
 * @return a set of decoded names
 */
private Set<String> getQueryParameterNames(Uri uri) {
    if (uri.isOpaque()) {
        throw new UnsupportedOperationException("This isn't a hierarchical URI.");
    }

    String query = uri.getEncodedQuery();
    if (query == null) {
        return Collections.emptySet();
    }

    Set<String> names = new LinkedHashSet<String>();
    int start = 0;
    do {
        int next = query.indexOf('&', start);
        int end = (next == -1) ? query.length() : next;

        int separator = query.indexOf('=', start);
        if (separator > end || separator == -1) {
            separator = end;
        }

        String name = query.substring(start, separator);
        names.add(Uri.decode(name));

        // Move start to end of name.
        start = end + 1;
    } while (start < query.length());

    return Collections.unmodifiableSet(names);
}
Run Code Online (Sandbox Code Playgroud)

如果你想自己深入研究,这里是原始代码:

http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.1_r1/android/net/Uri.java?av=f