Android版本大于2.3时出现FileNotFoundException

13
我试图将一个文件下载到手机的SD卡中。在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();
    }

2
不是这个导致了你的问题,但是你不应该为缓存文件使用绝对文件名。尝试使用以下代码:File file = new File(SDCardRoot,"cacheFile.ext");(注意没有“/”)。 - Ted Hopp
好的。谢谢。405 - 方法不允许。是否有另一个下载消息(“GET”似乎不起作用)。 - Leandros
尝试在您的代码中注释掉这个字符串urlConnection.setRequestMethod("GET");。 - Yury
Yury:仍然是同样的错误。 urlConnection.getRequestMethod() 只返回 POST。我想我必须接受不能获得文件的现实。是否可能打开文件并获取内容? - Leandros
1
有人建议使用Apache HttpClient可能可以解决它,在ICS这里不确定是否适用,值得去检查一下。点击这里 - yorkw
显示剩余3条评论
2个回答

37

urlConnection.setDoOutput(true); 简单删除即可。

感谢 pfn 在 #android-dev 的贡献。


好的答案,简短方便,加一分。谢谢,它解决了我的问题。 - Naveen Kumar
很好,它正在工作。但是使用本地主机IP而不是10.0.2.2。 - Muhammad Mubashir
5
据说这行JAVA代码将强制将HTTP协议中的GET请求改成POST请求,而不管原本是否指定为GET。 - Muhammad Mubashir
1
但是这给了我一个错误IO错误:不支持输出java.net.ProtocolException:不支持输出 - Sreekanth Karumanaghat
同样的错误:System.err(9083):java.net.ProtocolException:方法不支持请求体:GET。 - umesh

8
为了回答这个最初的问题,当你从服务器得到一个错误信息然后尝试访问getInputStream()时,也会出现FileNotFoundException。如果响应代码是400或更高,任何对getInputStream()的调用都将抛出此错误。在这种情况下,您应该检查getErrorStream()。请参见我在这里的答案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接