FileNotFoundException для HttpURLConnection в сэндвич мороженого - PullRequest
44 голосов
/ 20 февраля 2012

У меня есть приложение для 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. Кто-нибудь знает, что изменилось, и / или что это может быть за исправление?

Ответы [ 4 ]

96 голосов
/ 20 февраля 2012

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

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

27 голосов
/ 09 мая 2014

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...
}
5 голосов
/ 27 апреля 2013

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

connection.setInstanceFollowRedirects(false);
1 голос
/ 22 марта 2016

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

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