Android Lvl库和安卓棉花糖
由于缺少已删除的apache内容,Lvl库不再在Android Marshmallow上编译。您可以添加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
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。。。看起来不奇怪吗?这是最简单的解决方法。