2015-09-11 12 views
5

Ho seguito tutorial online su questo codice. e pubblicherà google play con Android api 23 Marshmallow.programmazione android NameValuePair rimosso per API 23

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) { 
      String name = item.getName(); 
      int i = 0; 
      while (results.containsKey(name)) { 
       name = item.getName() + ++i; 
      } 
      results.put(name, item.getValue()); 
     } 
    } catch (URISyntaxException e) { 
     Log.w(TAG, "Invalid syntax error while decoding extras data from server."); 
    } 
    return results; 
} 

Ma NameValuePair e URLEncodedUtils sono stati cancellati nella api23 Marshmallow. Come posso cambiare questo codice?

Per favore aiutatemi.

+1

possibile duplicato di [Come utilizzare l'eredità client HTTP Apache su Android M?] (Http://stackoverflow.com/questions/31653002/how-to-use-the-legacy-apache-http- client-on-android-m) –

risposta

0

È possibile aggiungere manualmente HttpClient libreria nel progetto

2

Usa httpMime.jar inviare dati al database del server.

Scaricare il file .jar da here e incollarlo nella cartella delle librerie.

Usage:

MultipartEntity multi = new MultipartEntity(); 
multi.addPart("username", new StringBody("Kgandroid")); 
multi.addPart("password", new StringBody("nopass")); 

Questa è una perfetta alternativa per namevaluepairs.

Per URLEncodedUtils:

this Leggi.

Troverete:

Questa anteprima rimuove il supporto per il client HTTP Apache. Se la tua app utilizza questo client e utilizza Android 2.3 (livello API 9) o superiore, utilizza invece la classe HttpURLConnection. Questa API è più efficiente perché riduce l'utilizzo della rete attraverso la compressione trasparente e la cache di risposta e riduce al minimo il consumo energetico.

Così ora dobbiamo usare HttpURLConnection

Un semplice tutorial per utilizzare HttpURLConnection si troverà here.

0

Non è esattamente quello che stai cercando, ma è davvero vicino:

Uri.Builder builder = new Uri.Builder() 
    .query(extras); 
Uri uri = builder.build(); 
Set<String> keys = uri.getQueryParameterNames(); 
Iterator<String> iterator = x.iterator(); 
HashMap<String, List<String>> map = new HashMap<>(); 
while(iterator.hasNext()) { 
     String key = iterator.next(); 
     List<String> values = uri.getQueryParameters(key); 
     map.put(key, values); 
} 

crea una Uri dall'ex parametro extras del metodo, che si presenta come la parte di query dell'URL. A questo punto è possibile chiamare getQueryParameterNames per recuperare un Set delle chiavi e da ciascuna chiave uno List<String> che rappresenta ogni valore di quel contenuto aggiuntivo che contiene per quella particolare chiave.

7

Basta usare Retrofit

O

Usa HttpURLConnection

O

Aggiungi questo al vostro build.gradle (ma non è suggerito)

android { 
    useLibrary 'org.apache.http.legacy' 
} 
+1

Questa è la migliore risposta in quanto elenca le 3 migliori opzioni (in ordine decrescente di desiderabilità non meno). –

2

Ecco l'equivalente codice utilizzando android.net.Uri per API livello 11 (Honeycomb) e versioni successive. Questo codice è piuttosto semplice, quindi non ha senso inserire API di terze parti o API legacy solo per evitare questo problema.

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