android - FileNotFoundException para HttpURLConnection en Ice Cream Sandwich
(4)
Intenta eliminar la llamada setDoOutput. Tomado de este blog: un blog.
Editar: Esto es necesario cuando se usa una llamada POST.
Tengo una aplicación para Android que funciona bien con Android 2.xy 3.x, pero falla cuando se ejecuta en Android 4.x.
El problema está en esta sección de código:
URL url = new URL("http://blahblah.blah/somedata.xml");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
InputStream inputStream = urlConnection.getInputStream();
Cuando la aplicación se ejecuta en Android 4.x, la llamada a getInputStream()
produce una FileNotFoundException
. Cuando el mismo binario se ejecuta en versiones anteriores de Android, tiene éxito. Las URL también funcionan bien en los navegadores web y con curl
.
Al parecer, algo acerca de HttpURLConnection
ha cambiado en ICS. ¿Alguien tiene alguna idea de qué ha cambiado y / o cuál podría ser la solución?
No sé por qué, pero lidiar manualmente con la redirección resuelve el problema.
connection.setInstanceFollowRedirects(false);
También se puede lanzar una excepción FileNotFoundException si el servidor devuelve un código de error erróneo (por ejemplo, 400 o 401). Puede manejar esto de la siguiente manera:
int responseCode = con.getResponseCode(); //can call this instead of con.connect()
if (responseCode >= 400 && responseCode <= 499) {
throw new Exception("Bad authentication status: " + responseCode); //provide a more meaningful exception message
}
else {
InputStream in = con.getInputStream();
//etc...
}
Un poco tarde pero también puedes verificar el contenido aceptado. Puedes añadir esta línea para aceptar todo tipo de contenidos.
urlConnection.setRequestProperty("Accept","*/*");