Lvl库和安卓棉花糖版本

18

Lvl库在Android Marshmallow上不再编译,因为缺少已删除的Apache相关内容。您可以添加useLibrary 'org.apache.http.legacy',但这只是一个临时解决方法。问题出在这个方法上:

private Map<String, String> decodeExtras(String extras) {
  Map<String, String> results = new HashMap<String, String>();
  try {
     URI rawExtras = new URI("?" + extras);
     List<NameValuePair> extraList = URLEncodedUtils.parse(rawExtras, "UTF-8");
     for (NameValuePair item : extraList) {
        results.put(item.getName(), item.getValue());
     }

  } catch (URISyntaxException ignored) {

  }
  return results;
}

NameValuePairURLEncodedUtils未找到。

新的"方式"是什么?我该如何用符合新的Android版本的新代码替换此调用?


同样的讨论可以在Google上找到:https://code.google.com/p/android/issues/detail?id=183386 - dira
是的,但它已被关闭为重复问题,另一个问题也被关闭为错误的论坛......那又怎样? - greywolf82
如果你解决了这个问题,请发布解决方案...如果我解决了,我也会这样做... - dira
4个回答

10

我写了自己的类,参考原始代码,作为临时解决方案:

public class URLUtils {
    private static final String PARAMETER_SEPARATOR = "&";
    private static final String NAME_VALUE_SEPARATOR = "=";
    private static final String DEFAULT_CONTENT_CHARSET = "ISO-8859-1";

    public static List<Item> parse(final URI uri, final String encoding) {
        List<Item> result = Collections.emptyList();
        final String query = uri.getRawQuery();
        if (query != null && query.length() > 0) {
            result = new ArrayList<>();
            parse(result, new Scanner(query), encoding);
        }
        return result;
    }

    public static void parse(final List<Item> parameters, final Scanner scanner, final String encoding) {
        scanner.useDelimiter(PARAMETER_SEPARATOR);
        while (scanner.hasNext()) {
            final String[] nameValue = scanner.next().split(NAME_VALUE_SEPARATOR);
            if (nameValue.length == 0 || nameValue.length > 2)
                throw new IllegalArgumentException("bad parameter");

            final String name = decode(nameValue[0], encoding);
            String value = null;
            if (nameValue.length == 2)
                value = decode(nameValue[1], encoding);
            parameters.add(new Item(name, value));
        }
    }


    private static String decode (final String content, final String encoding) {
        try {
            return URLDecoder.decode(content, encoding != null ? encoding : DEFAULT_CONTENT_CHARSET);
        } catch (UnsupportedEncodingException problem) {
            throw new IllegalArgumentException(problem);
        }
    }
}

public class Item {
    private String name;
    private String value;

    public Item(String n, String v) {
        name = n;
        value = v;
    }

    public String getName() {
        return name;
    }

    public String getValue() {
        return value;
    }
}

2
哇!谢谢!这个解决方法对我有用。虽然我不完全确定为什么Google的QA在Marshmallow预览版中甚至没有检测到LVL甚至无法编译,更不用说正式发布了。幸运的是,LVL是开源的。现在要让第三方也跟上步伐。 - DevByStarlight
唉!LVL现在可以工作了...但是Google下载库却出了问题。也许我会一直保持在API 22兼容模式下,直到Android N... - DevByStarlight
@greywolf82,你能展示一下如何使用这个类的具体例子吗? - DiscDev
1
我认为L和M存在很多问题,而谷歌正忙于发布新的操作系统N...这不奇怪吗? - Smeet

6

在LVL中,有两个地方出现了名为decodeExtras()的方法,它们的代码不同。无需编写冗长的自定义代码-android.net.Uri提供了类似的功能,下面的替换适用于API级别11(Honeycomb)及以上版本。

对于APKExpansionPolicy:

private Map<String, String> decodeExtras(String extras) {
    Map<String, String> results = new HashMap<>();
    Uri uri = new Uri.Builder().encodedQuery(extras).build();
    Set<String> parameterNames = uri.getQueryParameterNames();
    for (String parameterName : parameterNames) {
        List<String> values = uri.getQueryParameters(parameterName);
        int count = values.size();
        if (count >= 1) {
            results.put(parameterName, values.get(0));
            for (int i = 1; i < count; ++i) {
                results.put(parameterName + i, values.get(i));
            }
        }
    }
    return results;
}

对于 ServerManagedPolicy:

private Map<String, String> decodeExtras(String extras) {
    Map<String, String> results = new HashMap<>();
    Uri uri = new Uri.Builder().encodedQuery(extras).build();
    Set<String> parameterNames = uri.getQueryParameterNames();
    for (String parameterName : parameterNames) {
        results.put(parameterName, uri.getQueryParameter(parameterName));
    }
    return results;
}

这是最容易的修复。 - c.fogelklou

3

3
我的快速解决方案是用新代码替换旧代码。
    Uri uri = Uri.parse("?" + extras);
    for (String itemName : uri.getQueryParameterNames())
        results.put(itemName, uri.getQueryParameter(itemName));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接