HttpURLConnection冰淇淋三明治FileNotFoundException

我有一个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调用时需要的。

如果服务器返回错误代码(例如400或401),则也可能会引发FileNotFoundExceptionexception。 你可以这样处理:

 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... } 

我不知道为什么,但手动redirect处理解决了这个问题。

 connection.setInstanceFollowRedirects(false); 

有点晚,但你也可以validation接受的内容。 您可以添加此行来接受各种内容

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