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 2.3 和 Android 4.0 上的联系人照片 uri

我可以在 Android 上同时打开 Wi-Fi 和蜂窝网络接口吗?

将 Android 版本 2.3 转换为 1.5

Android 2.3 上的 webkit 渲染问题 - 一些列表视图元素的边界模糊