2015-08-20 2 views
16

Библиотека Lvl больше не компилируется на Android Marshmallow из-за отсутствия удаленных файлов Apache. Вы можете добавить useLibrary 'org.apache.http.legacy, но это временное решение. Проблема заключается в этот метод:Библиотека Lvl и android marshmallow

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; 
} 

NameValuePair и URLEncodedUtils не найдены.

Что нового? "way"? Как заменить этот вызов новым кодом, совместимым с новой версией Android?

+0

Same обсуждение HTTPS Google: // код. google.com/p/android/issues/detail?id=183386 – dira

+0

Да, но он был закрыт как дубликат, а другая проблема была закрыта слишком неправильно -forum ...... и так? – greywolf82

+0

, пожалуйста, отправьте решение, если вы его получите .... я сделаю то же самое, если я получу его .... – dira

ответ

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

Whew! Благодаря! Это обходное решение сработало для меня. Хотя я не совсем уверен в том, почему QA Google не обнаружил, что LVL даже не _compile_ во время предварительного просмотра Marshmallow, не говоря уже о официальном запуске. К счастью, LVL является открытым исходным кодом. Теперь, чтобы заставить сторонних сторон догнать тоже. – DevByStarlight

+0

Ух! LVL работает сейчас ... Но библиотека Google Download задыхается. Может быть, я просто останусь в режиме совместимости API 22 до тех пор, пока Android N ... – DevByStarlight

+0

@ greywolf82 вы можете показать конкретный пример того, как использовать этот класс? – DiscDev

3

мой быстрый и грязный раствор для замены устаревшего кода с

Uri uri = Uri.parse("?" + extras); 
    for (String itemName : uri.getQueryParameterNames()) 
     results.put(itemName, uri.getQueryParameter(itemName)); 
4

Методы имени decodeExtras() шоу в двух местах в LVL, а их код отличается. Не нужно придумывать подробный код - 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; 
} 
+0

Это было самое простое исправление. –

Смежные вопросы