FileNotFoundException para HttpURLConnection en Ice Cream Sandwich

Tengo una aplicación de 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 getInputStream() da como resultado 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 .

Aparentemente, algo sobre HttpURLConnection ha cambiado en ICS. ¿Alguien tiene alguna idea de qué ha cambiado y / o cuál es la solución?

Intente eliminar la llamada setDoOutput. Tomado de este blog: un blog

Editar: Esto es necesario cuando se usa una llamada POST.

También se puede lanzar una excepción FileNotFoundException si el servidor devuelve un código de error incorrecto (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... } 

No sé por qué, pero tratar manualmente la redirección resuelve el problema.

 connection.setInstanceFollowRedirects(false); 

Un poco tarde pero también puedes verificar el contenido aceptado. Puede agregar esta línea para aceptar todo tipo de contenido

 urlConnection.setRequestProperty("Accept","*/*");