FileNotFoundException on Android version > 2.3
Asked Answered
F

2

13

I try to download a file to sdcard on my phone. On Android 2.1, 2.2 and 2.3 everything works like intended, but on Android 4.0 (testen on emulator and my Galaxy Nexus) it throws a FileNotFoundException.

Stacktrace:

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)


My method for downloading file:

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();
    }
Fertility answered 27/2, 2012 at 21:18 Comment(8)
It's not what's causing your problem, but you should not be using an absolute file name for the cache file. Try this instead: File file = new File(SDCardRoot,"cacheFile.ext"); (note the absence of "/").Remise
Ok, thanks. Will do it for sure. Anyone get idea where the error comes from?Fertility
Check the response code urlConnection.getResponseCode(); before process input stream.Junina
Nice. Thanks. 405 - Method not allowed. Is there another download message ("GET" dont seems to work).Fertility
Try to comment this string urlConnection.setRequestMethod("GET"); in your code.Orpheus
Yury: The same error. urlConnection.getRequestMethod() returns only POST. I think I have to live, that I cant get the file. Is it possible to open file and get content?Fertility
The weird thing is, that it work on Android 2.2. :DFertility
Some one suggest using apache httpClient can fix it,not sure if it works in your case here ICS, worth to check it outJunina
F
37

Simple remove urlConnection.setDoOutput(true);

Thanks to pfn @ #android-dev

Fertility answered 27/2, 2012 at 22:22 Comment(5)
Nice answer +1 for short and convenient Thanks it solved my problem.Vanzant
Good it is working. but with localhost IP not by using 10.0.2.2.Gadolinite
Apparently this line in JAVA forces the http protocol to change a GET to a POST regardless of specifying the GETGadolinite
But that gives me an error IO error: Does not support output java.net.Protocol Exception: Does not support outputRumen
same here System.err(9083): java.net.ProtocolException: method does not support a request body: GETTimoshenko
E
8

So to answer the original question, a FileNotFoundException also comes when you get an error message from the server and then try to access getInputStream(). If the Response code is a 400 or above, any call to getInputStream() will throw this error. In this case, you should check getErrorStream() instead. See my answer here.

Emolument answered 9/8, 2013 at 16:30 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.