FileNotFoundException auf Android > 2.3
Ich versuche, eine Datei herunterladen, auf SD-Karte auf meinem Handy. Auf Android 2.1, 2.2 und 2.3 funktioniert alles wie vorgesehen, aber auf Android 4.0 (testen auf dem emulator und meinem Galaxy Nexus) es wirft ein 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)
Meine Methode für den Download-Datei:
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();
}
- Es ist nicht das, was verursacht dein problem, aber man sollte nicht mit einem absoluten Datei-Namen für die cache-Datei. Versuchen Sie dies:
File file = new File(SDCardRoot,"cacheFile.ext");
(beachten Sie das fehlen des "/"). - Ok, vielen Dank. Tun es sicher. Jemand Ahnung wo der Fehler herkommt?
- Überprüfen Sie den response-code urlConnection.getResponseCode(); vor Prozess-input-stream.
- Schön. Danke. 405 - Methode nicht erlaubt. Gibt es eine andere download-Nachricht ("GET" dont scheint zu funktionieren).
- Versuchen Sie, einen Kommentar unter dieser string urlConnection.setRequestMethod("GET"); in deinem code.
- Yury: Die gleichen Fehler.
urlConnection.getRequestMethod()
gibt nurPOST
. Ich glaube, ich habe zu Leben, dass I cant get die Datei. Ist es möglich, öffnen Sie die Datei und rufen Sie Inhalt? - Die seltsame Sache ist, dass es funktioniert auf Android 2.2. 😀
- Einige schlagen vor, mit Hilfe von apache httpClient es beheben kann,nicht sicher, ob es funktioniert in deinem Fall hier ICS, Wert zu check it out
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einfach entfernen
urlConnection.setDoOutput(true);
Dank pfn @ #android-dev
Zur Beantwortung der ursprünglichen Frage, eine
FileNotFoundException
auch kommt, wenn Sie erhalten eine Fehlermeldung vom server und dann versuchen, Zugriff aufgetInputStream()
. Falls der Response-code ist eine 400 oder oben, jeder Aufruf zurgetInputStream()
wird diesen Fehler auslösen. In diesem Fall sollten Sie überprüfengetErrorStream()
statt. Siehe meine Antwort hier.