Создать APK бесплатно

Функции устройства

Датчики, файлы и фоновые задачи

Подключайте BLE-датчики для фитнеса, принимайте файлы FIT/GPX/TCX и выполняйте задачи при закрытом приложении

Включите в мастере «Receive Shares From Other Apps» и отметьте, что принимает ваше приложение: текст и ссылки, файлы данных (FIT, GPX, TCX, CSV, JSON, XML…), фото, видео, аудио, документы. Ваше приложение появляется в ДВУХ местах, именно для этих типов:

  1. Окно Android «Открыть с помощью», когда пользователь нажимает на файл.
  2. Окно SHARE / EXPORT, которое показывают другие приложения, — включая спортивные устройства, экспортирующие файлы тренировок (.fit, .gpx, .tcx). Большинство фитнес-приложений экспортируют через «Поделиться», поэтому приложения, регистрирующие только «Открыть с помощью», там никогда не появляются.

Запросите файл через AppMint.getOpenedFile() — он дождётся вас, как бы поздно ни запустилась ваша страница. f.kind — это image, video, audio, document или data. Текстовые форматы (gpx, tcx, csv, json, xml…) приходят в готовом для использования виде f.text; небольшие бинарные файлы (.fit) — как f.base64; каждый файл данных и документ — как настоящий File в f.file. Фото, видео и аудио приходят как f.url — адрес для потокового воспроизведения в <video src> / <img src>, а f.getFile() — когда нужны сами байты. Ограничения по размеру нет. Общая ссылка или подпись читается через 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);

2Подключайте Bluetooth-датчики для фитнеса (пульс, скорость, каденс…)#

Включите разрешение Bluetooth в мастере — и ваше приложение сможет сопрягаться со стандартными BLE-датчиками: все совместимые нагрудные датчики и велодатчики используют одни и те же официальные профили Bluetooth, поэтому код для отдельных брендов не нужен:

  • Нагрудные датчики пульса → уд/мин
  • Датчики скорости/каденса → км/ч + обороты педалей в минуту
  • Измерители мощности → ватты
  • Беговые датчики → темп + шаги в минуту
  • Уровень заряда батареи каждого датчика

Порядок: сканирование (15 с) → пользователь выбирает устройство → подключение. Затем данные приходят как события. Для скорости нужен размер вашего колеса; задайте его один раз (по умолчанию 2096 мм = шоссейное колесо 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();

3Фоновые задачи и надёжное автосохранение (WorkManager)#

JavaScript не может выполняться, пока приложение закрыто, — это особенность Android, а не AppMint. Но может выполняться нативная задача доставки, которую ваша страница передаёт ОС. Два инструмента:

  1. workEnqueueOnline — надёжная одноразовая доставка. Идеальное автосохранение: передайте данные, и они будут отправлены POST-запросом на ваш сервер, когда появится сеть, с повторами и нарастающей задержкой, переживая завершение приложения и перезагрузки. Повторное использование того же id задачи заменяет ожидающее сохранение самым новым состоянием.
  1. workSchedulePeriodic — повторяющийся нативный HTTP-вызов (триггер синхронизации, heartbeat). Минимальный интервал в Android — 15 минут; меньшие значения повышаются до него.

Оба способа доставляют ВАШИ данные на ВАШ URL — серверная часть — это обычная конечная точка, которая у вас уже есть (edge-функция Supabase, ваш 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);
});

4Чек-лист и частые ошибки#

  • Файлы: переключатель должен быть ВКЛЮЧЁН на момент сборки — он регистрирует ваше приложение в манифесте Android, который нельзя изменить после установки. Пересоберите после включения.
  • BLE: переключатель разрешения Bluetooth должен быть ВКЛЮЧЁН на момент сборки. ПЕРВОЕ сканирование запрашивает у пользователя разрешение во время работы (Android 12+: «Устройства поблизости»; более старые: «Геолокация» — это правило Android для сканирования BLE, ваше приложение не читает местоположение).
  • BLE: сопрягайте в ВАШЕМ приложении, а не в настройках Bluetooth Android — BLE-датчики для фитнеса не являются классическими сопряжёнными устройствами.
  • Фоновые задачи: не планируйте периодическую задачу, чтобы «выполнять код моей страницы», — она доставляет HTTP на ваш сервер. Если нужна обработка на устройстве при закрытом приложении, для этого и нужна конечная точка доставки.
  • Автосохранение: всегда один и тот же id задачи. Разные id ставят в очередь несколько устаревших сохранений.

Эта страница создана из руководства по интеграции внутри самого приложения, поэтому в ней написано ровно то, что и в текущей сборке. Читать в формате Markdown.

Сверено с актуальным руководством 22.10.2026.