Crear APK gratis

Funciones del dispositivo

Native Folder Access

Usa carpetas locales respaldadas por SAF desde WebView y apps HTML sin conexión

1Qué hace esta función#

Esta función da a tu app web acceso controlado a una carpeta de Android elegida por el usuario mediante el Storage Access Framework (SAF). Funciona bien para apps HTML sin conexión, editores, flujos de copia de seguridad y restauración, y herramientas de importación y exportación.

NO da acceso sin restricciones al almacenamiento del dispositivo. El usuario elige explícitamente una carpeta y tu app solo puede trabajar dentro de ese árbol concedido.

2Actívalo en el generador#

En el Paso 4 del generador, ACTIVA 'Native Folder Access (SAF)'. Luego genera la app.

Cuando está activado, tu sitio web obtiene un asistente de alto nivel en window.WebToApkFS además del puente básico window.WebToApk.

⚠️ Nota sobre almacenamiento en Android 11+: en Android 11 y superior, leer el almacenamiento compartido requiere el permiso especial 'Acceso a todos los archivos'. Cuando tu app generada se inicia por primera vez y el permiso de almacenamiento está activado, abre automáticamente la pantalla de Ajustes de Android para que el usuario conceda este permiso. El usuario solo toca el interruptor en Ajustes y vuelve a la app, sin navegación manual.

3Comprobación de capacidad segura para el navegador#

Protege siempre tu código para que siga funcionando en Chrome/Safari, donde el puente de Android no existe:

function canUseNativeFiles() {
  return !!(window.WebToApkFS && window.WebToApkFS.isAvailable());
}

if (canUseNativeFiles()) {
  console.log('Android native folder access available');
}

4Pide al usuario que elija una carpeta#

Llama a requestAccess() desde un clic en un botón u otra acción clara del usuario. Abre el selector de carpetas de Android y devuelve la URI de la carpeta elegida.

async function connectFolder() {
  const result = await window.WebToApkFS.requestAccess();
  if (!result.success) {
    alert('Folder access was not granted');
    return false;
  }
  console.log('Granted folder:', result.folderUri);
  return true;
}

5Operaciones básicas con archivos#

Una vez concedido el acceso, puedes listar carpetas, crear directorios, leer archivos de texto, escribir archivos de texto, renombrar entradas y eliminar entradas.

// Create folders
window.WebToApkFS.mkdir('notes');
window.WebToApkFS.mkdir('notes/2026');

// Write a file
window.WebToApkFS.writeText('notes/2026/today.txt', 'Hello from offline app');

// Read it back
const text = window.WebToApkFS.readText('notes/2026/today.txt');
console.log(text);

// List folder contents
const entries = window.WebToApkFS.list('notes/2026');
console.log(entries);

6Renombrar y eliminar#

Renombrar cambia solo el nombre final de la entrada. Eliminar admite el borrado de directorios tanto no recursivo como recursivo.

// Rename file or folder
window.WebToApkFS.rename('notes/2026/today.txt', 'journal.txt');

// Delete a single file
window.WebToApkFS.delete('notes/2026/journal.txt');

// Delete a folder tree
window.WebToApkFS.delete('notes/2026', { recursive: true });

7Buenos casos de uso#

✅ Apps de notas o diarios sin conexión
✅ Herramientas de importación y exportación CSV / JSON
✅ Copia de seguridad y restauración locales sencillas
✅ Editores HTML estáticos que guardan contenido del usuario
✅ Apps de paneles que exportan informes como texto o CSV

8Limitaciones#

⚠️ Esto es solo para Android. No existirá en navegadores normales de escritorio o móvil.

⚠️ El asistente actual está diseñado en torno a listados de carpetas y archivos de texto. Los flujos binarios necesitan API adicionales.

⚠️ El acceso se limita a la única carpeta que el usuario concedió.

⚠️ Llama a estas API después de que la página haya cargado, para que el asistente ya esté inyectado.

9Ejemplo completo y funcional#

Este ejemplo conecta una carpeta, crea un directorio de trabajo, escribe un archivo JSON y muestra el listado de la carpeta:

async function setupWorkspace() {
  if (!window.WebToApkFS || !window.WebToApkFS.isAvailable()) {
    console.log('Native folder access not available in this browser');
    return;
  }

  if (!window.WebToApkFS.hasAccess()) {
    const granted = await window.WebToApkFS.requestAccess();
    if (!granted.success) return;
  }

  window.WebToApkFS.mkdir('workspace');
  window.WebToApkFS.writeText(
    'workspace/config.json',
    JSON.stringify({ updatedAt: new Date().toISOString(), mode: 'offline' }, null, 2)
  );

  const files = window.WebToApkFS.list('workspace');
  document.getElementById('output').textContent = JSON.stringify(files, null, 2);
}

Esta página se genera a partir de la Guía de integración dentro de la propia app, así que dice exactamente lo mismo que la versión actual. Léela como Markdown.

Comprobado con la guía publicada el 2026-10-22.