2012-02-27 2 views
13

Я пытаюсь загрузить файл на SDCard на своем телефоне. На Android 2.1, 2.2 и 2.3 все работает так, как предполагалось, но на Android 4.0 (testen on emulator и мой Galaxy Nexus) он выдает FileNotFoundException.FileNotFoundException в версии для Android> 2.3

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) 


Мой метод для загрузки файла:

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 = новый файл (SDCardRoot,« cacheFile.ext »);» (обратите внимание на отсутствие «/»). –

+0

Хорошо, спасибо. Будем делать это наверняка. Кто-нибудь понял, откуда возникает ошибка? – Leandros

+0

Проверьте код ответа urlConnection.getResponseCode(); перед потоком ввода процесса. – yorkw

ответ

37

Простой удалить urlConnection.setDoOutput(true);

Благодаря PFN @ # андроид-DEV

+3

+1 для простого и чистого решения. – yorkw

+0

Хороший ответ +1 для короткого и удобного Спасибо, он решил мою проблему. –

+0

+1, Как насчет 'setDoInput()'? – NullPointer

8

Так, чтобы ответить на оригинальный вопрос, a FileNotFoundException также появляется, когда вы получаете сообщение об ошибке с сервера, а затем пытаетесь получить доступ к getInputStream(). Если код ответа 400 или выше, любой вызов getInputStream() вызовет эту ошибку. В этом случае вместо этого вы должны выбрать getErrorStream(). См. Мой ответ here.

Смежные вопросы