Codificación URL en Android

¿Cómo codifica una URL en Android?

Pensé que era así:

final String encodedURL = URLEncoder.encode(urlAsString, "UTF-8"); URL url = new URL(encodedURL); 

Si hago lo anterior, http:// en urlAsString es reemplazado por http%3A%2F%2F en encodedURL y luego obtengo java.net.MalformedURLException cuando uso la URL.

No codifica la URL completa, solo partes de ella que provienen de “fonts no confiables”.

 String query = URLEncoder.encode("apples oranges", "utf-8"); String url = "http://stackoverflow.com/search?q=" + query; 

Alternativamente, puede usar Strings.urlEncode (String str) de DroidParts que no arroja excepciones controladas.

O usa algo como

 String uri = Uri.parse("http://...") .buildUpon() .appendQueryParameter("key", "val") .build().toString(); 

Voy a agregar una sugerencia aquí. Puede hacer esto, lo que evita tener que obtener bibliotecas externas.

Prueba esto:

 String urlStr = "http://abc.dev.domain.com/0007AC/ads/800x480 15sec h.264.mp4"; URL url = new URL(urlStr); URI uri = new URI(url.getProtocol(), url.getUserInfo(), url.getHost(), url.getPort(), url.getPath(), url.getQuery(), url.getRef()); url = uri.toURL(); 

Puedes ver que en esta URL en particular, necesito tener esos espacios codificados para que pueda usarlos para una solicitud.

Aprovecha un par de funciones disponibles para ti en las clases de Android. En primer lugar, la clase de URL puede dividir una url en sus componentes adecuados, por lo que no es necesario que realice ningún trabajo de búsqueda / reemplazo de cadenas. En segundo lugar, este enfoque aprovecha la característica de clase URI de escapes adecuados de componentes cuando se construye un URI a través de componentes en lugar de a partir de una sola cadena.

La belleza de este enfoque es que puede tomar cualquier cadena de URL válida y hacer que funcione sin necesidad de ningún conocimiento especial de la misma.

Para Android, usaría String android.net.Uri.encode (String s)

Codifica caracteres en la cadena dada como ‘%’ – octetos escapados usando el esquema UTF-8. Deja letras (“AZ”, “az”), números (“0-9”) y caracteres sin reserva (“_- !. ~ ‘() *”) intactos. Codifica todos los otros personajes.

Ex/

 String urlEncoded = "http://stackoverflow.com/search?q=" + Uri.encode(query); 

También puedes usar esto

 private static final String ALLOWED_URI_CHARS = "@#&=*+-_.,:!?()/~'%"; String urlEncoded = Uri.encode(path, ALLOWED_URI_CHARS); 

es el método más simple

 try { query = URLEncoder.encode(query, "utf-8"); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

puedes usar los métodos a continuación

 public static String parseUrl(String surl) throws Exception { URL u = new URL(surl); return new URI(u.getProtocol(), u.getAuthority(), u.getPath(), u.getQuery(), u.getRef()).toString(); } 

o

 public String parseURL(String url, Map params) { Builder builder = Uri.parse(url).buildUpon(); for (String key : params.keySet()) { builder.appendQueryParameter(key, params.get(key)); } return builder.build().toString(); } 

el segundo es mejor que el primero.

Asegúrate de usar try … catch. Si no, falla