2015-08-20 158 views
16

由於缺少apache的東西,Lvl庫不能在Android Marshmallow上編譯。您可以添加useLibrary 'org.apache.http.legacy,但這只是一個臨時解決方法。問題是這樣的方法:Lvl庫和android棉花糖

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都沒有發現。

什麼是新的"way"?我怎樣才能用符合新Android版本的新代碼替換這個調用?

+0

同樣的討論://代碼。 google.com/p/android/issues/detail?id=183386 – dira

+0

是的,但它已被關閉爲重複,另一個問題已被關閉,因爲錯誤 - 論壇......等等? – 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

哎!謝謝!此替代方法適用於我。雖然我不完全確定爲什麼谷歌的QA沒有檢測到LVL在Marshmallow的預覽期間甚至沒有編譯,更不用說在官方發佈後。幸運的是,LVL是開源的。現在讓第三方也趕上。 – DevByStarlight

+0

呃! LVL現在可以工作......但Google下載庫扼殺了一個毛球。也許我會留在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

這是最簡單的修復方法。 –