Ответ 1
Попробуйте удалить вызов setDoOutput. Взято из этого блога: блог
Изменить: это необходимо при использовании вызова POST.
У меня есть 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. Кто-нибудь знает, что изменилось и/или какое исправление может быть?
Попробуйте удалить вызов 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","*/*");