Android 版本 > 2.3 上的 FileNotFoundException
Posted
技术标签:
【中文标题】Android 版本 > 2.3 上的 FileNotFoundException【英文标题】:FileNotFoundException on Android version > 2.3 【发布时间】:2012-03-17 08:42:55 【问题描述】:我尝试将文件下载到手机上的 sdcard。在 android 2.1、2.2 和 2.3 上,一切都按预期工作,但在 Android 4.0(在模拟器和我的 Galaxy Nexus 上测试)它会抛出 FileNotFoundException
。
堆栈跟踪:
02-27 21:49:06.733: W/System.err(27648): java.io.FileNotFoundException: http://www.wdr.de/wdrlive/media/wdr5.m3u
02-27 21:49:06.733: W/System.err(27648): at libcore.net.http.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:177)
02-27 21:49:06.733: W/System.err(27648): at de.arvidg.test.StartActivity$9.run(StartActivity.java:833)
02-27 21:49:06.733: W/System.err(27648): at java.lang.Thread.run(Thread.java:856)
我下载文件的方法:
downloadFile("http://www.wdr.de/wdrlive/media/wdr5.m3u");
public void downloadFile(final String fileUrl)
new Thread(new Runnable()
@Override
public void run()
try
URL url = new URL(fileUrl);
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
urlConnection.setRequestMethod("GET");
urlConnection.setDoOutput(true);
urlConnection.connect();
// File cacheDir = appContext.getExternalCacheDir();
// File file = new File("/mnt/sdcard", "/cacheFile.ext");
File SDCardRoot = Environment.getExternalStorageDirectory();
File file = new File(SDCardRoot,"/cacheFile.ext");
if(!file.exists()) file.createNewFile();
FileOutputStream fileOutput = new FileOutputStream(file);
InputStream inputStream = urlConnection.getInputStream();
int totalSize = urlConnection.getContentLength();
int downloadedSize = 0;
byte[] buffer = new byte[1024];
int bufferLength = 0;
while ( (bufferLength = inputStream.read(buffer)) > 0 )
fileOutput.write(buffer, 0, bufferLength);
downloadedSize += bufferLength;
Log.d(TAG, "downloadedSize = " + downloadedSize + " | totalSize = " + totalSize);
// updateProgress(downloadedSize, totalSize);
fileOutput.close();
catch (MalformedURLException e)
e.printStackTrace();
catch (IOException e)
e.printStackTrace();
).start();
【问题讨论】:
这不是导致您的问题的原因,但您不应该为缓存文件使用绝对文件名。试试这个:File file = new File(SDCardRoot,"cacheFile.ext");
(注意没有“/”)。
好的,谢谢。一定会做到的。有人知道错误来自哪里吗?
查看响应码 urlConnection.getResponseCode();在处理输入流之前。
不错。谢谢。 405 - 不允许的方法。是否还有其他下载消息(“GET”似乎不起作用)。
有人建议使用 apache httpClient 可以修复它,不确定它是否适用于你的情况 ICS,值得check it out
【参考方案1】:
简单删除urlConnection.setDoOutput(true);
感谢 pfn @#android-dev
【讨论】:
不错的答案 +1 简短方便 谢谢它解决了我的问题。 很好,它正在工作。但使用 localhost IP 而不是使用 10.0.2.2。 显然 JAVA 中的这一行强制 http 协议将 GET 更改为 POST,而不管指定 GET 但这给了我一个错误 IO 错误:不支持输出 java.net.Protocol 异常:不支持输出 这里相同 System.err(9083): java.net.ProtocolException: 方法不支持请求正文:GET【参考方案2】:所以要回答最初的问题,当您从服务器收到错误消息然后尝试访问getInputStream()
时,也会出现FileNotFoundException
。如果响应码是 400 或更高,任何对getInputStream()
的调用都会抛出这个错误。在这种情况下,您应该检查getErrorStream()
。看我的回答here。
【讨论】:
以上是关于Android 版本 > 2.3 上的 FileNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
在 Android 2.3 .X (Gingerbread) 及更低版本上修改 LayerDrawable 层
Android 2.3 和 Android 4.0 上的联系人照片 uri