Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

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

Ответ 2

Также может быть вызвано исключение 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...
}

Ответ 3

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

connection.setInstanceFollowRedirects(false);

Ответ 4

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

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