Pregunta Android escribe en la carpeta de la tarjeta SD


Estoy usando el siguiente código para descargar un archivo de mi servidor y luego escribirlo en el directorio raíz de la tarjeta SD, todo funciona bien:

package com.downloader;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;

import android.os.Environment;
import android.util.Log;

public class Downloader {

    public void DownloadFile(String fileURL, String fileName) {
        try {
            File root = Environment.getExternalStorageDirectory();
            URL u = new URL(fileURL);
            HttpURLConnection c = (HttpURLConnection) u.openConnection();
            c.setRequestMethod("GET");
            c.setDoOutput(true);
            c.connect();
            FileOutputStream f = new FileOutputStream(new File(root, fileName));

            InputStream in = c.getInputStream();

            byte[] buffer = new byte[1024];
            int len1 = 0;
            while ((len1 = in.read(buffer)) > 0) {
                f.write(buffer, 0, len1);
            }
            f.close();
        } catch (Exception e) {
            Log.d("Downloader", e.getMessage());
        }

    }
}

Sin embargo, usando Environment.getExternalStorageDirectory(); significa que el archivo siempre escribirá en la raíz /mnt/sdcard. ¿Es posible especificar una determinada carpeta para escribir el archivo?

Por ejemplo: /mnt/sdcard/myapp/downloads

Aclamaciones

Eef


76
2017-08-23 21:24


origen


Respuestas:


File sdCard = Environment.getExternalStorageDirectory();
File dir = new File (sdCard.getAbsolutePath() + "/dir1/dir2");
dir.mkdirs();
File file = new File(dir, "filename");

FileOutputStream f = new FileOutputStream(file);
...

152
2017-08-23 21:36



Agregar permiso a Android Manifest

Añadir este permiso WRITE_EXTERNAL_STORAGE a su manifiesto de aplicaciones.

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="your.company.package"
    android:versionCode="1"
    android:versionName="0.1">
    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <!-- ... -->
    </application>
    <uses-sdk android:minSdkVersion="7" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest> 

Verificar disponibilidad de almacenamiento externo

Siempre debe verificar primero la disponibilidad. Un fragmento de la documentación oficial de Android en el almacenamiento externo.

boolean mExternalStorageAvailable = false;
boolean mExternalStorageWriteable = false;
String state = Environment.getExternalStorageState();

if (Environment.MEDIA_MOUNTED.equals(state)) {
    // We can read and write the media
    mExternalStorageAvailable = mExternalStorageWriteable = true;
} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
    // We can only read the media
    mExternalStorageAvailable = true;
    mExternalStorageWriteable = false;
} else {
    // Something else is wrong. It may be one of many other states, but all we need
    //  to know is we can neither read nor write
    mExternalStorageAvailable = mExternalStorageWriteable = false;
}

Usa un escritor de archivos

Por último pero no menos importante olvídate de la FileOutputStream y usa un FileWriter en lugar. Más información sobre ese formulario de clase el FileWriter javadoc. Es posible que desee agregar un poco más de manejo de errores aquí para informar al usuario.

// get external storage file reference
FileWriter writer = new FileWriter(getExternalStorageDirectory()); 
// Writes the content to the file
writer.write("This\n is\n an\n example\n"); 
writer.flush();
writer.close();

29
2017-11-20 17:18



Encontré la respuesta aquí - http://mytechead.wordpress.com/2014/01/30/android-create-a-file-and-write-to-external-storage/

Dice,

/**

* Method to check if user has permissions to write on external storage or not

*/

public static boolean canWriteOnExternalStorage() {
   // get the state of your external storage
   String state = Environment.getExternalStorageState();
   if (Environment.MEDIA_MOUNTED.equals(state)) {
    // if storage is mounted return true
      Log.v("sTag", "Yes, can write to external storage.");
      return true;
   }
   return false;
}

y luego usemos este código para escribir en el almacenamiento externo:

// get the path to sdcard
File sdcard = Environment.getExternalStorageDirectory();
// to this path add a new directory path
File dir = new File(sdcard.getAbsolutePath() + "/your-dir-name/");
// create this directory if not already created
dir.mkdir();
// create the file in which we will write the contents
File file = new File(dir, "My-File-Name.txt");
FileOutputStream os = outStream = new FileOutputStream(file);
String data = "This is the content of my file";
os.write(data.getBytes());
os.close();

Y esto es todo. Si ahora visita su carpeta / sdcard / your-dir-name /, verá un archivo llamado - My-File-Name.txt con el contenido especificado en el código.

PD: - Necesitas el siguiente permiso -

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

2
2018-01-30 08:05



Para descargar un archivo para descargar o carpeta de música en SDCard 

File downlodDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);// or DIRECTORY_PICTURES

Y no te olvides de agregar estos permisos en manifiesto

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

-1
2017-10-05 15:31