FileNotFoundException для HttpURLConnection в сэндвиче с мороженым

У меня есть приложение для Android, которое отлично работает с Android 2.x и 3.x, но оно не работает при запуске на Android 4.x.

Проблема в этом разделе кода:

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(); 

Когда приложение запускается на Android 4.x, вызов getInputStream() приводит к FileNotFoundException . Когда тот же самый бинарный файл работает в более ранних версиях Android, он преуспевает. URL-адреса также отлично работают в веб-браузерах и с curl .

По-видимому, что-то о HttpURLConnection изменилось в ICS. Кто-нибудь знает, что изменилось, и / или какое исправление может быть?

Solutions Collecting From Web of "FileNotFoundException для HttpURLConnection в сэндвиче с мороженым"

Попробуйте удалить вызов setDoOutput. Из этого блога: блог

Изменить: это необходимо при использовании вызова POST.

Исключение FileNotFoundException также может быть запущено, если сервер возвращает код ошибки (например, 400 или 401). Вы можете справиться с этим следующим образом:

 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... } 

Я не знаю, почему, но ручная работа с перенаправлением решает проблему.

 connection.setInstanceFollowRedirects(false); 

Немного поздно, но вы также можете проверить принятый контент. Вы можете добавить эту строку, чтобы принимать все виды контента

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