冰淇淋三明治中HttpURLConnection的FileNotFoundException

时间:2012-02-20 17:45:32

标签: android httpurlconnection filenotfoundexception

我有一个适用于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中发生了变化。有没有人知道发生了什么变化,和/或修复可能是什么?

4 个答案:

答案 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}}