Storage Access Framework: qué es, cómo funciona y acceso a archivos en Android

Autor: IT Sectr Publicado: 2026-07-10 Tiempo de lectura: 6 min

Storage Access Framework es un framework de Android para el acceso seguro a archivos y documentos a través de un diálogo de selección del sistema. En lugar de solicitar permisos amplios de lectura del almacenamiento, la aplicación recibe un enlace URI al archivo seleccionado por el usuario. Según Android Developers (2026), SAF admite almacenamiento local, servicios en la nube Google Drive y Dropbox a través de DocumentProvider. El framework se introdujo en Android 4.4 y se convirtió en el estándar para trabajar con documentos a partir de Android 10.

Puntos clave

  • SAF es un framework de Android para seleccionar archivos mediante un diálogo del sistema sin permisos amplios.
  • Enlace URI reemplaza la ruta de archivo directa: la aplicación trabaja con el archivo a través de un content URI.
  • Persistent permissions permiten conservar el acceso al archivo después de reiniciar la aplicación.
  • DocumentProvider extiende SAF para el acceso a almacenamiento en la nube y personalizado.
  • Android 10 hizo obligatorio SAF para acceder a archivos fuera del sandbox de la aplicación.

¿Qué es Storage Access Framework?

Storage Access Framework es una parte del SDK de Android que proporciona una interfaz unificada para seleccionar y crear documentos a través de un diálogo del sistema. SAF abstrae la ubicación física de los archivos: la aplicación no sabe de dónde se lee el archivo — disco local, Google Drive o Dropbox.

La arquitectura de SAF incluye tres componentes: la aplicación cliente que inicia la solicitud, el selector del sistema — un diálogo estándar de selección de archivos, y el DocumentProvider — un proveedor de contenido que implementa el acceso a archivos de un almacenamiento específico. El usuario ve una interfaz unificada independientemente de la fuente de datos.

SAF está disponible desde Android 4.4 (API 19). Inicialmente, el framework solo admitía documentos, pero en Android 5.0 se añadió soporte para directorios mediante ACTION_OPEN_DOCUMENT_TREE. Desde Android 10, SAF se convirtió en la forma recomendada de acceder a cualquier archivo fuera del almacenamiento específico de la aplicación.

Cómo funciona SAF: selector del sistema y URI

SAF lanza un diálogo de selección de archivos del sistema mediante un Intent con la acción ACTION_OPEN_DOCUMENT. El usuario ve una lista de fuentes disponibles: almacenamiento interno, Google Drive, Dropbox y otros proveedores registrados. Después de seleccionar un archivo, el sistema devuelve un content URI con permisos de acceso temporales.

El content URI tiene el formato content://com.android.externalstorage.documents/document/primary/Download/file.pdf. A diferencia de un URI file://, el content URI no revela la ruta real del archivo y funciona a través de DocumentProvider. La aplicación lee el archivo mediante ContentResolver.openInputStream con el URI obtenido.

El selector del sistema admite automáticamente búsqueda, ordenación y filtrado de archivos por tipos MIME. El desarrollador especifica los tipos necesarios mediante Intent.putExtra(Intent.EXTRA_MIME_TYPES, arrayOf("application/pdf", "image/*")), y el selector muestra solo los archivos relevantes.

Ciclo de vida del acceso URI

Por defecto, el URI es válido hasta que se reinicia la aplicación o se reinicia el dispositivo. Para acceso a largo plazo, la aplicación solicita takePersistableUriPermission — esto permite leer el archivo en ejecuciones posteriores sin tener que volver a seleccionarlo mediante el diálogo.

ACTION_OPEN_DOCUMENT y ACTION_CREATE_DOCUMENT

SAF proporciona tres acciones principales para trabajar con archivos: abrir, crear y seleccionar árbol de carpetas. ACTION_OPEN_DOCUMENT abre el selector del sistema para elegir un archivo existente. ACTION_CREATE_DOCUMENT crea un archivo nuevo — el usuario ingresa un nombre en el diálogo y la aplicación recibe un URI para escritura.

ACTION_OPEN_DOCUMENT_TREE permite seleccionar un directorio completo y obtener acceso a todos los archivos dentro de él. Esto se usa en administradores de archivos, aplicaciones de respaldo y sincronización. La aplicación recibe un URI de directorio y puede enumerar recursivamente el contenido mediante DocumentFile.

AcciónPropósitoFlag
ACTION_OPEN_DOCUMENTSeleccionar un archivo existenteREAD_FLAG
ACTION_CREATE_DOCUMENTCrear un archivo nuevoWRITE_FLAG
ACTION_OPEN_DOCUMENT_TREESeleccionar un directorioREAD + WRITE

Para cada acción, los tipos MIME se especifican mediante EXTRA_MIME_TYPES. Se pueden especificar varios tipos: "application/pdf", "image/*", "text/plain". Si no se especifican tipos, el selector muestra todos los archivos.

Persistent URI permissions

Persistent URI permissions es un mecanismo de SAF que permite conservar el acceso a un archivo después de que finalice la sesión actual. Sin este flag, el URI solo es válido hasta que se reinicia la aplicación. La aplicación solicita el flag FLAG_GRANT_PERSISTABLE_URI_PERMISSION junto con los flags READ y WRITE.

Para guardar los permisos se utiliza el método ContentResolver.takePersistableUriPermission. El sistema guarda el URI en un registro especial y restaura el acceso en el siguiente inicio de la aplicación. Para comprobar si la aplicación tiene acceso persistente a un URI, se utiliza ContentResolver.persistedUriPermissions.

El usuario puede revocar los permisos guardados mediante Configuración → Aplicaciones → Permisos. La aplicación debe manejar el escenario en el que el acceso a un archivo se pierde inesperadamente. Se recomienda verificar el acceso mediante ContentResolver.openInputStream antes de comenzar a trabajar y manejar correctamente SecurityException.

Ejemplos de código: selección de archivo mediante SAF

SAF se lanza a través de un Intent estándar. El código es mínimo: crear un Intent con ACTION_OPEN_DOCUMENT, especificar los tipos MIME y lanzarlo mediante ActivityResultContracts.StartActivityForResult. Después de seleccionar un archivo, el callback recibe el URI en data.data, que luego se utiliza para la lectura.

kotlin
val pickFile = registerForActivityResult(
    ActivityResultContracts.StartActivityForResult()
) { result ->
    result.data?.data?.let { uri ->
        val inputStream = contentResolver?.openInputStream(uri)
        // read from inputStream
    }
}

val intent = Intent(Intent.ACTION_OPEN_DOCUMENT).apply {
    addCategory(Intent.CATEGORY_OPENABLE)
    setType("application/pdf")
    putExtra(Intent.EXTRA_ALLOW_MULTIPLE, true)
}
pickFile.launch(intent)

Creación de archivo mediante ACTION_CREATE_DOCUMENT

Para escribir un archivo nuevo, use ACTION_CREATE_DOCUMENT. El Intent acepta el tipo MIME y el nombre del archivo mediante EXTRA_TITLE. Después de seleccionar una carpeta y confirmar, el usuario devuelve un URI en el que la aplicación escribe datos mediante ContentResolver.openOutputStream. El sistema crea automáticamente el archivo en la ubicación elegida.

SAF vs READ_EXTERNAL_STORAGE

SAF se diferencia del tradicional READ_EXTERNAL_STORAGE en un enfoque fundamentalmente diferente hacia la seguridad. En lugar de solicitar acceso a todo el almacenamiento de una vez, SAF solicita acceso solo a un archivo específico. Esto minimiza la superficie de ataque y aumenta la confianza del usuario.

READ_EXTERNAL_STORAGE otorga acceso a todos los archivos del dispositivo, incluyendo fotos y documentos de otras aplicaciones. En Android 10+, este enfoque está restringido. SAF, por el contrario, proporciona acceso solo al archivo seleccionado por el usuario y requiere confirmación explícita para cada archivo. Para operaciones por lotes con medios, use MediaStore; para documentos individuales, use SAF.

La principal desventaja de SAF es la necesidad de seleccionar cada archivo individualmente. Para operaciones masivas (copia de seguridad, sincronización de carpetas), se utiliza ACTION_OPEN_DOCUMENT_TREE, que otorga acceso a todos los archivos del directorio seleccionado. La solución depende del escenario: SAF es óptimo para selección del usuario, MediaStore para acceso programático a medios.

Preguntas frecuentes

¿Qué es Storage Access Framework en Android?

Storage Access Framework es un framework de Android para el acceso seguro a archivos a través de un diálogo de selección del sistema. La aplicación recibe un content URI para el archivo seleccionado sin solicitar permisos amplios de lectura del almacenamiento.

¿Cómo abrir un archivo mediante SAF?

Cree un Intent con ACTION_OPEN_DOCUMENT, especifique el tipo MIME mediante setType y láncelo a través de ActivityResultContracts. En el callback, obtenga el URI de data.data y léalo mediante ContentResolver.openInputStream.

¿Qué son los persistent URI permissions?

Persistent URI permissions es un mecanismo para conservar el acceso a un URI después de reiniciar la aplicación. Se solicita mediante el flag FLAG_GRANT_PERSISTABLE_URI_PERMISSION y el método takePersistableUriPermission.

¿Qué tipos MIME admite SAF?

SAF admite cualquier tipo MIME: application/pdf, image/*, text/plain, application/zip y otros. Los tipos se especifican mediante Intent.putExtra con un array EXTRA_MIME_TYPES.

¿En qué se diferencia SAF de MediaStore?

SAF está diseñado para seleccionar archivos individuales por el usuario a través de un diálogo del sistema. MediaStore proporciona acceso programático a todos los archivos multimedia del dispositivo a través de una base de datos multimedia sin interacción del usuario.

Resumen

  • Storage Access Framework es un framework de Android para el acceso seguro a archivos mediante un selector del sistema sin permisos amplios.
  • Content URI reemplaza las rutas de archivo: la aplicación trabaja con archivos a través de DocumentProvider, no mediante enlaces file:// directos.
  • ACTION_OPEN_DOCUMENT abre un archivo existente, ACTION_CREATE_DOCUMENT crea uno nuevo, ACTION_OPEN_DOCUMENT_TREE selecciona una carpeta.
  • Persistent permissions conservan el acceso al URI después de reiniciar la aplicación mediante takePersistableUriPermission.
  • Android 10 hizo obligatorio SAF para acceder a archivos fuera del almacenamiento específico de la aplicación, restringiendo READ_EXTERNAL_STORAGE.
  • DocumentProvider extiende SAF para la integración con almacenamiento en la nube y personalizado.
  • La elección entre SAF y MediaStore depende del escenario: SAF para selección del usuario, MediaStore para acceso programático a medios.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también