DEV Community

 AppInitDev
AppInitDev

Posted on Edited on

Android Storage Access Framework: listar archivos sin pedir acceso total al almacenamiento

Android Storage Access Framework: listar archivos sin pedir acceso total al almacenamiento

Una herramienta de archivos necesita una estrategia para acceder a documentos que respete el modelo de permisos moderno de Android. Solicitar acceso indiscriminado a todo el almacenamiento puede ser innecesario para muchas tareas.

El problema y el alcance del ejemplo

La ficha de FileManager: Gestor Archivos resume su función así: «Gestor de archivos para organizar, limpiar y proteger tu almacenamiento.» FileManager ofrece gestión de carpetas y archivos según su descripción pública. Nuestro ejemplo elige una carpeta concreta mediante el selector del sistema y lista su contenido. Es una alternativa educativa para funciones acotadas; no pretende explicar cómo está implementado FileManager.

Cómo reproducir la idea

Crea una Activity Android con Kotlin y agrega androidx.documentfile:documentfile y androidx.activity:activity en versiones compatibles con tu proyecto. Este ejemplo es una Activity mínima que presenta el selector de carpetas.

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.widget.TextView
import androidx.activity.result.contract.ActivityResultContracts
import androidx.activity.ComponentActivity
import androidx.documentfile.provider.DocumentFile

class MainActivity : ComponentActivity() {
    private lateinit var result: TextView
    private val pickFolder = registerForActivityResult(
        ActivityResultContracts.OpenDocumentTree()
    ) { uri ->
        if (uri == null) return@registerForActivityResult
        contentResolver.takePersistableUriPermission(
            uri, Intent.FLAG_GRANT_READ_URI_PERMISSION
        )
        val folder = DocumentFile.fromTreeUri(this, uri)
        val names = folder?.listFiles()?.mapNotNull { it.name }.orEmpty()
        result.text = names.joinToString("\n").ifBlank { "Carpeta vacía" }
    }
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        result = TextView(this).apply {
            text = "Toca para elegir una carpeta"
            setPadding(24, 24, 24, 24)
            setOnClickListener { pickFolder.launch(null) }
        }
        setContentView(result)
    }
}
Enter fullscreen mode Exit fullscreen mode

Qué demuestra el código

OpenDocumentTree permite elegir un directorio y recibir una URI autorizada. DocumentFile trabaja con documentos mediante esa URI, no suponiendo que tienen una ruta local convencional. Conservar permiso de lectura facilita volver a abrir ese árbol mientras el proveedor siga disponible.

Pruebas recomendadas

Prepara una carpeta con dos archivos y ábrela desde el selector. Deben aparecer sus nombres. Repite con una carpeta vacía y luego con un proveedor remoto: observarás que los tiempos y capacidades cambian según el origen.

Límites que conviene reconocer

El ejemplo lista archivos en el hilo principal (aceptable únicamente para la demo de pocos elementos); usa coroutines y un repositorio en producción. El acceso a ciertas ubicaciones está restringido por Android; un proveedor puede revocar permisos y no todos permiten escritura.

Qué aprendemos

Un gestor de archivos robusto diseña alrededor de URI y proveedores, no alrededor de una única ruta del teléfono. Esto mejora compatibilidad y limita el alcance de los permisos.

Contexto y enlaces del autor

El tema se relaciona con las funciones declaradas públicamente de FileManager: Gestor Archivos, una aplicación Android de AppInitDev. El código anterior es un ejemplo independiente: no se ha inspeccionado el repositorio privado ni se afirma que sea la implementación interna de la app. La referencia aparece al final para ofrecer contexto, no como requisito para completar el tutorial.

aPPS

Referencia técnica

Android Developers: Access documents and other files

Top comments (0)