Crear Directorios en Almacenamiento Externo y Interno - Android

En este tutorial vamos a ver la forma de como crear directorios tanto en el almacenamiento externo como en el almacenamiento interno del sistema operativo Android.

Crear directorios en el almacenamiento externo

Para crear una carpeta en el almacenamiento externo primero tenemos que asegurarnos que esta disponible.

Verificar si el almacenamiento externo esta disponible

Para verificar si esta disponible lo hacemos con el siguiente función.

private boolean isExternalStorageWritable() {  
  String state = Environment.getExternalStorageState();
  return Environment.MEDIA_MOUNTED.equals(state);
}

USO: condicionamos para mostrar una respuesta, en el logcat.

public static final String TAG = "logcat";

//@Override
//onCreate
if(isExternalStorageWritable()){  
  Log.d(TAG, "El almacenamiento externo esta disponible :)");
}else{
  Log.e(TAG, "El almacenamiento externo no esta disponible :(");
}

LOGCAT: Android Monitor incluye un monitor de logcat que sirve para mostrar mensajes de depuración.

Mensaje logcat almacenamiento disponible

Crear directorio

Vamos a crear nuestro directorio en el almacenamiento externo, tanto privado como público.

Crear directorio público

Para que nuestro directorio sea público vamos a tener que crearlo como subdirectorio en una de las carpetas publicas, como pueden ser DIRECTORY_PICTURES (carpeta de imágenes), DIRECTORY_MOVIES (carpeta de vídeos), DIRECTORY_DOWNLOADS (carpeta de descargas), DIRECTORY_RINGTONES (carpeta de ringtones), etc.

Antes de continuar no olvides de asignar los permisos correspondientes para la escritura y lectura de archivos, en el AndroidManifest.xml.

Nota: en versiones de API 23 o superiores los permisos se realizan en tiempo de ejecución.

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

Función para la creación de un directorio público.

public File crearDirectorioPublico(String nombreDirectorio) {  
  //Crear directorio público en la carpeta Pictures.
  File directorio = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), nombreDirectorio);
  //Muestro un mensaje en el logcat si no se creo la carpeta por algun motivo
  if (!directorio.mkdirs())
      Log.e(TAG, "Error: No se creo el directorio público");

  return directorio;
}

USO: para poder hacer uso de esta función y crear la carpeta, vamos a llamar la función en el evento que ustedes requieran como son onClick, onCreate, etc.

if(isExternalStorageWritable()){  
  String nombreDirectorioPublico = "subdirectorio-publico-pictures";
  crearDirectorioPublico(nombreDirectorioPublico);
}

Uso de Android Device Monitor

Para poder ver nuestra carpeta creada vamos a utilizar Android Device Monitor, para abrirlo realizamos la siguiente secuencia, dirígete a la barra de menú la opción Tools > Android > Android Device Monitor.

Android Device Monitor

Ver resultado

Una vez abierto Android Device Monitor, elegimos el emulador donde se esta ejecutando la app, en el caso de tener abiertos varios emuladores, luego accedemos a la carpeta raíz storage, luego sdcard y en mi caso Pictures, ya que en mi función le asigne que se creara en ese directorio, por si no lo entienden DIRECTORY_PICTURES es una constante que almacena el String o texto Pictures.

Resultado de creación directorio público

Crear directorio privado

Los directorios privados al contrario de los públicos, solo pueden ser accedidos para la misma app que lo implementa, ya que se crea una estructura de archivos con una ruta que contiene el nombre del paquete.

Función para la creación de un directorio privado.

public File crearDirectorioPrivado(Context context, String nombreDirectorio) {  
  //Crear directorio privado en la carpeta Pictures.
  File directorio =new File(
          context.getExternalFilesDir(Environment.DIRECTORY_PICTURES),
          nombreDirectorio);
  //Muestro un mensaje en el logcat si no se creo la carpeta por algun motivo
  if (!directorio.mkdirs())
      Log.e(TAG, "Error: No se creo el directorio privado");

  return directorio;
}

USO: para crear la carpeta privada vamos a hacer uso de la función antes creada.

if(isExternalStorageWritable()){  
  String nombreDirectorioPrivado = "subdirectorio-privado-pictures";
  crearDirectorioPrivado(this, nombreDirectorioPrivado);
}

Ver resultado

Nos dirigimos a Android Device Monitor, elegimos el emulador donde se esta ejecutando la app, luego a la carpeta raíz storage > Android > data > <nombre del paquete> > files > <nombre del directorio que lo contendra> > <nombre del directorio>

Resultado de creación directorio privado

Estructura de ruta del directorio: recuerden que esto puede variar de acuerdo a como lo implementen, pero para este tutorial esta perfecto.

Crear directorios en el almacenamiento interno

Para crear directorios en el almacenamiento interno del dispositivo, no hay que realizar ninguna comprobación previa ya que si no estaría disponible la memoria interna el dispositivo no funcionaria.

Función para la creación de un directorio en el almacenamiento interno.

public File crearCarpetaAlmInterno(String nombreDirectorio){  
  //Crear directorio en la memoria interna.
  File directorio = new File(getFilesDir(), nombreDirectorio);
  //Muestro un mensaje en el logcat si no se creo la carpeta por algun motivo
  if(!directorio.mkdirs()){
      Log.e(TAG, "Error: No se creo el directorio privado");
  }
  return directorio;
}

USO: ahora vamos a utilizar nuestra función crearCarpetaAlmInterno(), creada anteriormente.

String nombreDirectorioAlmInterno = "directorio-creado-memoria-interna";  
crearCarpetaAlmInterno(nombreDirectorioAlmInterno);  

Ver resultado

Nos dirigimos a Android Device Monitor, elegimos el emulador donde se esta ejecutando la app, luego a la carpeta raíz data > data > nombre de nuestro paquete > files.

Resultado de la creación de un sub directorio en la memoria interna

Verificar si las carpetas fueron creadas con código

Para los que no prefieren utilizar Android Device Monitor, o simplemente desean realizar la verificación para realizar ciertas acciones, este es la manera de comprobar si existen los directorios o archivos en Android.

//Obtengo las rutas de las carpetas creadas
String rutaDirectorioAlmExternoPublico = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES) + "/" + nombreDirectorioAlmExternoPublico;  
String rutaDirectorioAlmExternoPrivado = getApplicationContext().getExternalFilesDir(Environment.DIRECTORY_PICTURES) + "/" + nombreDirectorioAlmExternoPrivado;  
String rutaDirectorioInterno = getFilesDir() + "/" + nombreDirectorioAlmInterno;

//Creo variables tipo File, con la rutas antes obtenidas
File directorioAlmExternoPublico = new File(rutaDirectorioAlmExternoPublico);  
File directorioAlmExternoPrivado = new File(rutaDirectorioAlmExternoPrivado);  
File directorioAlmInterno = new File(rutaDirectorioInterno);

//comprobar si la carpeta "subdirectorio-publico-pictures"
if (directorioAlmExternoPublico.exists() && directorioAlmExternoPublico.isDirectory()) {  
  Log.i(TAG, "El directorio " + nombreDirectorioAlmExternoPublico + " ya existe.");
} else {//Se ejecuta si no existe el directorio
  Log.i(TAG, "El directorio " + nombreDirectorioAlmExternoPublico + " no existe.");
}

//comprobar si la carpeta "subdirectorio-privado-pictures"
if (directorioAlmExternoPrivado.exists() && directorioAlmExternoPrivado.isDirectory()) {  
  Log.i(TAG, "El directorio " + nombreDirectorioAlmExternoPrivado + " ya existe.");
} else {//Se ejecuta si no existe el directorio
  Log.i(TAG, "El directorio " + nombreDirectorioAlmExternoPrivado + " no existe.");
}

//comprobar si la carpeta "directorio-creado-memoria-interna"
if (directorioAlmInterno.exists() && directorioAlmInterno.isDirectory()) {  
  Log.i(TAG, "El directorio " + nombreDirectorioAlmInterno + " ya existe.");
} else {//Se ejecuta si no existe el directorio
  Log.i(TAG, "El directorio " + nombreDirectorioAlmInterno + " no existe.");
}

Código completo y funcional

Puedes descargarlo desde GitHubGist.

Descargar código - crear directorios en Android

Luis Rene Mas Mas's Picture

Luis Rene Mas Mas

Hola, soy desarrollador front-end & dasarrollador móvil (Android), me encanta las tecnologías web - móvil, también administro este blog.

Trujillo - Perú @01luisrene

Únete al Blog

Obtén los últimos artículos publicados directamente en tu bandeja de entrada.

O suscríbase vía RSS con Feedly!

Comparte tu Opinión