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","*/*");