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();
}
Simple remove urlConnection.setDoOutput(true);
Thanks to pfn @ #android-dev
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With