Crear APK gratis

Funciones del dispositivo

Sensores, archivos y tareas en segundo plano

Empareja sensores de fitness BLE, recibe archivos FIT/GPX/TCX, ejecuta tareas con la app cerrada

Activa 'Receive Shares From Other Apps' en el asistente y marca lo que acepta tu app: texto y enlaces, archivos de datos (FIT, GPX, TCX, CSV, JSON, XML…), fotos, vídeos, audio, documentos. Tu app aparece en DOS lugares, exactamente para esos tipos:

  1. La hoja 'Abrir con' de Android cuando el usuario toca un archivo.
  2. La hoja de COMPARTIR / EXPORTAR que muestran otras apps, incluidos los dispositivos deportivos que exportan archivos de entrenamiento (.fit, .gpx, .tcx). La mayoría de las apps de fitness exportan mediante Compartir, por eso las apps que solo registran 'Abrir con' nunca aparecen ahí.

Pide el archivo con AppMint.getOpenedFile(): espera por ti, por tarde que arranque tu página. f.kind es image, video, audio, document o data. Los formatos de texto (gpx, tcx, csv, json, xml…) llegan como f.text listo para usar; los binarios pequeños (.fit) como f.base64; todo archivo de datos y documento como un File real en f.file. Las fotos, vídeos y audio llegan como f.url, una dirección reproducible por streaming para <video src> / <img src>, con f.getFile() cuando necesites los bytes. No hay límite de tamaño. Un enlace o texto compartido se lee con WebToApk.getSharedText().

// Ask on startup — the file waits, however late your page mounts
const f = await AppMint.getOpenedFile();   // null if opened normally
if (f) {
  if (f.name.endsWith('.gpx') || f.name.endsWith('.tcx')) {
    const xml = new DOMParser().parseFromString(f.text, 'text/xml');
    const points = xml.querySelectorAll('trkpt, Trackpoint');
    console.log('workout with ' + points.length + ' points');
  } else if (f.name.endsWith('.fit')) {
    // .fit is binary — a real File; parse its bytes
    parseFit(new Uint8Array(await f.file.arrayBuffer())); // e.g. fit-file-parser
  } else if (f.kind === 'video') {
    document.querySelector('video').src = f.url;   // streams from disk, seekable
  }
}

// A shared link or caption
const shared = JSON.parse(WebToApk.getSharedText() || 'null');
if (shared) console.log('shared:', shared.url || shared.text);

2Empareja sensores de fitness Bluetooth (frecuencia cardíaca, velocidad, cadencia…)#

Activa el permiso de Bluetooth en el asistente y tu app podrá emparejar sensores BLE estándar: todas las bandas de pecho y sensores de bici compatibles usan los mismos perfiles oficiales de Bluetooth, así que no hace falta código por marca:

  • Bandas de frecuencia cardíaca → ppm
  • Sensores de velocidad/cadencia → km/h + rpm de pedaleo
  • Medidores de potencia → vatios
  • Sensores de pie para correr → ritmo + pasos/min
  • El nivel de batería de cada sensor

Flujo: escanear (15 s) → el usuario elige un dispositivo → conectar. Luego los datos llegan como eventos. La velocidad necesita el tamaño de tu rueda; configúralo una vez (predeterminado 2096 mm = rueda de carretera 700x23c).

// 1. Scan — each found sensor fires a 'device' event:
window.addEventListener('appmint:ble', function (e) {
  const m = e.detail;
  if (m.kind === 'device') {
    // {address, name, sensors:['heart_rate','speed_cadence',...], rssi}
    addToPickerUI(m);
  }
  if (m.kind === 'data') {
    if (m.type === 'heart_rate')     showBpm(m.data.bpm);
    if (m.type === 'speed_cadence') {
      if (m.data.speedKmh)   showSpeed(m.data.speedKmh.toFixed(1));
      if (m.data.cadenceRpm) showCadence(Math.round(m.data.cadenceRpm));
    }
    if (m.type === 'power')   showWatts(m.data.watts);
    if (m.type === 'battery') showBattery(m.data.percent);
  }
  if (m.kind === 'error') console.warn('BLE:', m.error);
});

WebToApk.bleSetWheelCircumference(2105); // your wheel, in mm
WebToApk.bleStartScan();

// 2. When the user taps a device from your picker:
WebToApk.bleConnect(device.address);

// 3. Done training:
WebToApk.bleDisconnect();

3Tareas en segundo plano y autoguardado duradero (WorkManager)#

JavaScript no puede ejecutarse mientras tu app está cerrada: eso es Android, no AppMint. Lo que SÍ puede ejecutarse es una tarea de entrega nativa que tu página entrega al sistema operativo. Dos herramientas:

  1. workEnqueueOnline: entrega única duradera. Autoguardado perfecto: entrega los datos y se envían por POST a tu servidor cuando haya red, reintentando con espera creciente, sobreviviendo a cierres de la app y reinicios. Reutilizar el mismo id de tarea sustituye el guardado pendiente por el estado más reciente.
  1. workSchedulePeriodic: una llamada HTTP nativa recurrente (disparador de sincronización, latido). El intervalo mínimo de Android es de 15 minutos; los valores más cortos se ajustan a ese mínimo.

Ambos entregan TU contenido a TU URL: el lado del servidor es un endpoint normal que ya tienes (función edge de Supabase, tu API…).

// Durable auto-save: call this on every important change.
function autoSave(state) {
  WebToApk.workEnqueueOnline(
    'autosave',                          // same id → newest state wins
    'https://api.example.com/save',
    'POST',
    JSON.stringify({ 'Authorization': 'Bearer ' + token }),
    JSON.stringify(state)
  );
}

// Recurring sync every 30 minutes, even if the app is closed:
WebToApk.workSchedulePeriodic(
  'sync', 'https://api.example.com/sync', 'POST', '{}', '', 30
);

// Manage jobs:
WebToApk.workCancel('sync');
WebToApk.workList('req1');
window.addEventListener('appmint:work', function (e) {
  // {id, status:'enqueued'|'scheduled'|'cancelled'|'failed', reason?, intervalMinutes?}
  // or, for workList: {requestId, jobs:[{id, periodic, url, createdAt, pendingDelivery}]}
  console.log('work:', e.detail);
});

4Lista de comprobación y errores comunes#

  • Archivos: el interruptor debe estar ACTIVADO al compilar: registra tu app en el manifiesto de Android, que no puede cambiar después de la instalación. Vuelve a compilar después de activarlo.
  • BLE: el interruptor del permiso de Bluetooth debe estar ACTIVADO al compilar. El PRIMER escaneo pide al usuario el permiso en tiempo de ejecución (Android 12+: 'Dispositivos cercanos'; anteriores: Ubicación: es una regla de Android para el escaneo BLE, tu app no lee la ubicación).
  • BLE: empareja en TU app, no en los ajustes de Bluetooth de Android: los sensores de fitness BLE no son dispositivos emparejados clásicos.
  • Tareas en segundo plano: no programes una tarea periódica para 'ejecutar el código de mi página': entrega HTTP a tu servidor. Si necesitas procesamiento en el dispositivo mientras está cerrada, para eso sirve el endpoint de entrega.
  • Autoguardado: usa siempre el MISMO id de tarea. Ids distintos ponen en cola varios guardados obsoletos.

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.