2012-02-27 10 views
13

Provo a scaricare un file su sdcard sul mio telefono. Su Android 2.1, 2.2 e 2.3 tutto funziona come previsto, ma su Android 4.0 (testato su emulatore e il mio Galaxy Nexus) getta un FileNotFoundException.FileNotFoundException su versione 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) 


Il mio metodo per il download di 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(); 
    } 
+2

Non è ciò che sta causando il problema, ma non si dovrebbe utilizzare un nome file assoluto per il file di cache. Prova invece: 'File file = nuovo File (SDCardRoot," cacheFile.ext ");' (notare l'assenza di "/"). –

+0

Ok, grazie. Lo farà di sicuro. Qualcuno ha idea da dove viene l'errore? – Leandros

+0

Controllare il codice di risposta urlConnection.getResponseCode(); prima del flusso di input del processo. – yorkw

risposta

37

remove semplice urlConnection.setDoOutput(true);

Grazie alla PFN @ Android-dev #

+3

+1 per la soluzione semplice e pulita. – yorkw

+0

Bella risposta +1 per breve e conveniente Grazie ha risolto il mio problema. –

+0

+1, che dire di 'setDoInput()'? – NullPointer

8

Quindi, per rispondere alla domanda originale, a FileNotFoundException arriva anche quando si riceve un messaggio di errore dal server e quindi si tenta di accedere a getInputStream(). Se il codice di risposta è un 400 o superiore, qualsiasi chiamata a getInputStream() genererà questo errore. In questo caso, dovresti controllare invece getErrorStream(). Vedi la mia risposta here.

Problemi correlati