Android Lvl库和安卓棉花糖

Android Lvl库和安卓棉花糖,android,android-6.0-marshmallow,Android,Android 6.0 Marshmallow,由于缺少已删除的apache内容,Lvl库不再在Android Marshmallow上编译。您可以添加usebrary'org.apache.http.legacy,但这只是一个临时解决办法。问题在于这种方法: private Map<String, String> decodeExtras(String extras) { Map<String, String> results = new HashMap<String, String>(); tr

由于缺少已删除的apache内容,Lvl库不再在Android Marshmallow上编译。您可以添加
usebrary'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;
}
专用地图解码附加(字符串附加){
映射结果=新的HashMap();
试一试{
URI rawExtras=新URI(“?”+extras);
List extraList=URLEncodedUtils.parse(rawExtras,“UTF-8”);
对于(NameValuePair项:外部列表){
results.put(item.getName(),item.getValue());
}
}捕获(忽略URISyntaxException){
}
返回结果;
}
未找到
NameValuePair
URLEncodedUtils


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

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

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;
    }
}
公共类URLUtils{
私有静态最终字符串参数_SEPARATOR=“&”;
私有静态最终字符串名称_值_分隔符=“=”;
私有静态最终字符串默认值\u CONTENT\u CHARSET=“ISO-8859-1”;
公共静态列表解析(最终URI、最终字符串编码){
列表结果=Collections.emptyList();
final String query=uri.getRawQuery();
if(query!=null&&query.length()>0){
结果=新的ArrayList();
解析(结果、新扫描仪(查询)、编码);
}
返回结果;
}
公共静态void解析(最终列表参数、最终扫描程序、最终字符串编码){
scanner.useDelimiter(参数分隔符);
while(scanner.hasNext()){
最终字符串[]名称值=scanner.next().split(名称值分隔符);
如果(nameValue.length==0 | | nameValue.length>2)
抛出新的IllegalArgumentException(“坏参数”);
最终字符串名称=解码(名称值[0],编码);
字符串值=null;
如果(nameValue.length==2)
值=解码(名称值[1],编码);
添加(新项目(名称、值));
}
}
私有静态字符串解码(最终字符串内容、最终字符串编码){
试一试{
返回urldecker.decode(内容,编码!=null?编码:默认\u内容\u字符集);
}捕获(不支持DencodingException问题){
抛出新的IllegalArgumentException(问题);
}
}
}
公共类项目{
私有字符串名称;
私有字符串值;
公共项(字符串n、字符串v){
name=n;
值=v;
}
公共字符串getName(){
返回名称;
}
公共字符串getValue(){
返回值;
}
}

我快速而肮脏的解决方案是用

    Uri uri = Uri.parse("?" + extras);
    for (String itemName : uri.getQueryParameterNames())
        results.put(itemName, uri.getQueryParameter(itemName));
名为decodeExtras()的方法显示在LVL中的两个位置,它们的代码不同。无需编写详细的自定义代码-提供类似的功能,下面的替换适用于API级别11(蜂巢)及以上

对于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;
}
专用地图解码附加(字符串附加){
映射结果=新的HashMap();
Uri=newURI.Builder().encodedQuery(extras.build();
Set parameterNames=uri.getQueryParameterNames();
用于(字符串参数名称:参数名称){
列表值=uri.getQueryParameters(parameterName);
int count=values.size();
如果(计数>=1){
results.put(parameterName,values.get(0));
对于(int i=1;i
对于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;
}
专用地图解码附加(字符串附加){
映射结果=新的HashMap();
Uri=newURI.Builder().encodedQuery(extras.build();
Set parameterNames=uri.getQueryParameterNames();
用于(字符串参数名称:参数名称){
results.put(parameterName,uri.getQueryParameter(parameterName));
}
返回结果;
}

我在上找到了更新版本,该问题已通过谷歌上的相同讨论得到解决,是的,但它已作为副本关闭,而另一个问题也因错误论坛而关闭……因此?如果你得到了解决方案,请发布解决方案。。。。如果我得到它,我也会做同样的事……唷!谢谢这个变通办法对我很有效。虽然我不能完全确定为什么谷歌的QA没有检测到LVL在棉花糖的预览期间甚至没有编译,更不用说正式发布后了。幸运的是,LVL是开源的。现在让第三方也跟上。啊!LVL现在工作。。。但是谷歌下载库堵塞了一个毛球。也许我会一直保持API 22兼容模式,直到安卓N…@greywolf82你能给出一个具体的例子说明如何使用这个类吗?我认为L和M中有很多问题,谷歌正忙于发布新的OS N。。。看起来不奇怪吗?这是最简单的解决方法。