我有一个适用于Android 2.x和3.x的Android应用,但在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上运行相同的二进制文件时,它会成功。这些网址在网络浏览器和curl
中也可以正常使用。
显然,HttpURLConnection
的某些内容在ICS中发生了变化。有没有人知道发生了什么变化,和/或修复可能是什么?
答案 0 :(得分:96)
尝试删除setDoOutput调用。摘自此博客: a blog
编辑:使用POST呼叫时需要这样做。
答案 1 :(得分:27)
如果服务器返回错误的错误代码(例如,400或401),也可能抛出FileNotFoundException。您可以按如下方式处理:
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...
}
答案 2 :(得分:5)
我不知道为什么,但手动处理重定向可以解决问题。
connection.setInstanceFollowRedirects(false);
答案 3 :(得分:1)
有点晚,但您也可以验证接受的内容。您可以添加此行以接受各种内容
{{1}}