Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 冰淇淋三明治中HttpURLConnection的FileNotFoundException_Android_Httpurlconnection_Filenotfoundexception - Fatal编程技术网

Android 冰淇淋三明治中HttpURLConnection的FileNotFoundException

Android 冰淇淋三明治中HttpURLConnection的FileNotFoundException,android,httpurlconnection,filenotfoundexception,Android,Httpurlconnection,Filenotfoundexception,我有一个安卓应用程序,可以在安卓2.x和3.x上正常运行,但在安卓4.x上运行时失败 问题出在代码的这一部分: URL url = new URL("http://blahblah.blah/somedata.xml"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setRequestMethod("GET"); urlConnection.setDoOutp

我有一个安卓应用程序,可以在安卓2.x和3.x上正常运行,但在安卓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在web浏览器和
curl
中也可以正常工作


显然,ICS中关于
HttpURLConnection
的某些内容发生了变化。有人知道发生了什么变化和/或修复了什么吗?

尝试删除setDoOutput调用。摘自本博客:


编辑:在使用POST呼叫时需要此选项。

我不知道为什么,但是手动处理重定向可以解决问题

connection.setInstanceFollowRedirects(false);

如果服务器返回错误代码(例如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...
}
int responseCode=con.getResponseCode()//可以调用此函数而不是con.connect()

如果(responseCode>=400&&responseCode有点晚,但您也可以验证接受的内容。您可以添加此行以接受所有类型的内容

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

文档说
setDoOutput(true)
意味着
setRequestMethod(“POST”)
。你的意思是什么?它的意思是做一个GET。(我没有写代码,所以我不知道为什么
setDoOutput(true)
在那里。)FWIW,
setRequestMethod(“GET”)
setDoOutput(true)
出现在许多使用
HttpURLConnection
的示例代码中。它在哪里强制POST?HTTP方法
HttpURLConnection
默认使用
GET
方法。如果
setDoOutput(true),它将使用
POST
已被调用。它很旧,但我所做的只是调用了conn.setRequestMethod(“GET”),我们设置了conn.setDoOutput(true)这意味着它是一个POST和vis Versay是的,没错,删除该行可以在ICS上工作,而且似乎在旧的Android上也可以工作。+1000谢谢!我正在构建一个用于访问后端的库。我花了几个小时试图弄清楚为什么URLConnections可以从命令行工作,但当我将库加载到我的Android项目。这个答案至少为我节省了一个小时。我的第一次谷歌搜索给了我这个:)请注意,这是必要的,当提出发帖请求时!在这种情况下,它应该保持在原位。嘿,伙计们。当您使用POST调用时,您会怎么做?我收到的响应代码为500,因为我没有设置
内容类型
,感谢您指出在这些情况下可能会引发此异常。对于任何想知道为什么没有“getResponseCode()”的人方法:只需将您的连接转换为HttpUrlConnection有人知道为什么Android会在代码上抛出FileNotFoundException吗?@Davidord我有这个错误,因为我的URL格式不正确。我使用了
urlcoder.encode(myURL,“UTF-8”)用于我的URL中包含空格字符的部分,一切都进行得很顺利。