Функции устройства
Датчики, файлы и фоновые задачи
Подключайте BLE-датчики для фитнеса, принимайте файлы FIT/GPX/TCX и выполняйте задачи при закрытом приложении
1Принимайте файлы, фото, видео и ссылки из других приложений#
Включите в мастере «Receive Shares From Other Apps» и отметьте, что принимает ваше приложение: текст и ссылки, файлы данных (FIT, GPX, TCX, CSV, JSON, XML…), фото, видео, аудио, документы. Ваше приложение появляется в ДВУХ местах, именно для этих типов:
- Окно Android «Открыть с помощью», когда пользователь нажимает на файл.
- Окно 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. Но может выполняться нативная задача доставки, которую ваша страница передаёт ОС. Два инструмента:
- workEnqueueOnline — надёжная одноразовая доставка. Идеальное автосохранение: передайте данные, и они будут отправлены POST-запросом на ваш сервер, когда появится сеть, с повторами и нарастающей задержкой, переживая завершение приложения и перезагрузки. Повторное использование того же id задачи заменяет ожидающее сохранение самым новым состоянием.
- 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 ставят в очередь несколько устаревших сохранений.