2010-12-28 13 views
11

He estado sacando mi pelo de esto por un tiempo. Se supone que el siguiente método descarga un archivo y lo guarda en la ubicación especificada en el disco duro.Método de archivo mkdirs() que no funciona en android/java

private static void saveImage(Context context, boolean backgroundUpdate, URL url, File file) { 

    if (!Tools.checkNetworkState(context, backgroundUpdate)) 
     return; 

    // Get the image 
    try { 
     // Make the file 
     file.getParentFile().mkdirs(); 

     // Set up the connection 
     URLConnection uCon = url.openConnection(); 
     InputStream is = uCon.getInputStream(); 
     BufferedInputStream bis = new BufferedInputStream(is); 

     // Download the data 
     ByteArrayBuffer baf = new ByteArrayBuffer(50); 
     int current = 0; 
     while ((current = bis.read()) != -1) { 
       baf.append((byte) current); 
     } 

     // Write the bits to the file 
     OutputStream os = new FileOutputStream(file); 
     os.write(baf.toByteArray()); 
     os.close(); 
    } catch (Exception e) { 
     // Any exception is probably a newtork faiilure, bail 
     return; 
    } 
} 

Además, si el archivo no existe, se supone que debe crear el directorio del archivo. (Y si ya hay otro archivo en ese lugar, simplemente no debería hacer nada). Sin embargo, por alguna razón, el método mkdirs() nunca hace el directorio. He intentado todo desde paréntesis explícitos, hasta hacer explícitamente la clase de archivo padre, y nada parece funcionar. Estoy bastante seguro de que la unidad se puede escribir, ya que solo se invoca después de que ya se haya determinado, también es cierto después de ejecutarla durante la depuración. Entonces, el método falla porque los directorios principales no están hechos. ¿Alguien puede decirme si hay algún problema con la forma en que lo estoy llamando?

Además, si ayuda, aquí está el origen del archivo que estoy llamando en:

https://github.com/LeifAndersen/NetCatch/blob/master/src/net/leifandersen/mobile/android/netcatch/services/RSSService.java

Gracias

Respuesta

30

Si está escribiendo contenidos en la tarjeta SD espero que tengas añadido android.permission.WRITE_EXTERNAL_STORAGE permiso en su manifiesto

+0

No puedo creerlo, eso funcionó. Me siento como un idiota ahora. Por otro lado, sin embargo, estaba trabajando mágicamente otras otras revisiones del proyecto, extraño. Muchas gracias. –

3

¿Estas seguro que mkdirs está fallando? ¿Por qué no comprueba el valor devuelto de la llamada mkdirs y registra un mensaje de error si devuelve falso?

if (!file.getParentFile().exists() && !file.getParentFile().mkdirs()){ 
    log("Unable to create " + file.getParentFile()); 
} 

que sospecha que usted puede ser sorprendido con lo que el archivo fue ...

PS - y por favor hacer algo con ese gestor de errores - como mínimo, registrar el error. Capturar la excepción y hacer un regreso silencioso es una práctica horrible.

+0

Buena llamada al registrar el error, esa es una buena idea y la he cambiado ahora. Y afirma que no puede crear el archivo (insertando su error en el suyo como se sugiere). –

13

Por favor, consulte con esto, puede ayudarle a ..

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

entrar tis permiso en el manifiesto archivo.

+0

Sí, eso es todo. –

5

En respuesta a Kevin Day, existe otra modalidad de falla que las publicaciones anteriores no mencionaron. Es que incluso si tiene android.permission.WRITE_EXTERNAL_STORAGE en su manifiesto, si está intentando escribir en medios como /mnt/sdcard que está montado externamente como un dispositivo USB (es decir, conectó su dispositivo como un disco externo a su PC con un cable USB) en el tiempo que intenta escribir, no puede escribir en el sistema de archivos/mnt/sdcard. En este caso FILE.mkdir devolverá falso. Obviamente, si no está revisando el código de retorno, no verá este problema hasta que obtenga un IOException si intenta crear un archivo en el directorio que cree que creó. Y si no crea un archivo en este directorio inexistente, la aplicación simplemente fallará en silencio.

Cometa este error constantemente al depurar aplicaciones de Android. Olvídese de que no puedo tener la tarjeta SD montada externamente y al mismo tiempo hacer que mi aplicación le escriba.

Cuestiones relacionadas