Fitur perangkat
Sensor, File & Pekerjaan Latar Belakang
Pasangkan sensor kebugaran BLE, terima file FIT/GPX/TCX, jalankan tugas saat aplikasi tertutup
1Terima file, foto, video, dan tautan dari aplikasi lain#
Aktifkan 'Receive Shares From Other Apps' di wizard dan centang apa yang diterima aplikasi Anda - teks dan tautan, file data (FIT, GPX, TCX, CSV, JSON, XML…), foto, video, audio, dokumen. Aplikasi Anda muncul di DUA tempat, untuk jenis-jenis itu saja:
- Lembar 'Open with' Android saat pengguna mengetuk sebuah file.
- Lembar SHARE / EXPORT yang ditampilkan aplikasi lain - termasuk perangkat olahraga yang mengekspor file latihan (.fit, .gpx, .tcx). Kebanyakan aplikasi kebugaran mengekspor lewat Share, itulah sebabnya aplikasi yang hanya mendaftar 'Open with' tidak pernah muncul di sana.
Minta file dengan AppMint.getOpenedFile() - ia menunggu Anda, selambat apa pun halaman Anda dimulai. f.kind adalah image, video, audio, document, atau data. Format teks (gpx, tcx, csv, json, xml…) tiba sebagai f.text yang siap pakai; biner kecil (.fit) sebagai f.base64; setiap file data dan dokumen sebagai File sungguhan di f.file. Foto, video, dan audio tiba sebagai f.url, alamat yang dapat di-stream untuk <video src> / <img src>, dengan f.getFile() saat Anda membutuhkan byte-nya. Tidak ada batas ukuran. Tautan atau caption yang dibagikan dibaca dengan 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);2Pasangkan sensor kebugaran Bluetooth (detak jantung, kecepatan, kadensi…)#
Aktifkan izin Bluetooth di wizard dan aplikasi Anda dapat memasangkan sensor BLE standar - setiap sabuk dada dan pod sepeda yang sesuai standar memakai profil Bluetooth resmi yang sama, sehingga tidak perlu kode per merek:
- Sabuk detak jantung → bpm
- Pod kecepatan/kadensi → km/jam + rpm pedal
- Power meter → watt
- Footpod lari → pace + langkah/menit
- Level baterai setiap sensor
Alur: pindai (15 dtk) → pengguna memilih perangkat → sambungkan. Data lalu mengalir sebagai event. Kecepatan membutuhkan ukuran roda Anda; atur sekali (default 2096mm = roda sepeda jalan raya 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();3Tugas latar belakang & simpan otomatis yang tahan lama (WorkManager)#
JavaScript tidak dapat berjalan saat aplikasi Anda tertutup - itu aturan Android, bukan AppMint. Yang BISA berjalan adalah tugas pengiriman native yang diserahkan halaman Anda ke OS. Dua alat:
- workEnqueueOnline - pengiriman sekali jalan yang tahan lama. Simpan otomatis yang sempurna: serahkan data dan data di-POST ke server Anda saat ada jaringan, mencoba ulang dengan backoff, bertahan saat aplikasi dimatikan paksa dan reboot. Memakai ulang id tugas yang sama menggantikan penyimpanan yang tertunda dengan status terbaru.
- workSchedulePeriodic - panggilan HTTP native berulang (pemicu sinkronisasi, heartbeat). Interval minimum Android adalah 15 menit; nilai yang lebih pendek dipaksa naik.
Keduanya mengirim payload ANDA ke URL ANDA - sisi servernya adalah endpoint biasa yang sudah Anda miliki (edge function Supabase, API Anda…).
// 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);
});4Daftar periksa & kesalahan umum#
- File: sakelar harus AKTIF saat build - ini mendaftarkan aplikasi Anda di manifest Android, yang tidak bisa diubah setelah instalasi. Build ulang setelah mengaktifkannya.
- BLE: sakelar izin Bluetooth harus AKTIF saat build. Pemindaian PERTAMA meminta izin runtime kepada pengguna (Android 12+: 'Nearby devices'; yang lebih lama: Lokasi - itu aturan Android untuk pemindaian BLE, aplikasi Anda tidak membaca lokasi).
- BLE: pasangkan di aplikasi ANDA, bukan di pengaturan Bluetooth Android - sensor kebugaran BLE bukan perangkat berpasangan klasik.
- Tugas latar belakang: jangan menjadwalkan tugas periodik untuk 'menjalankan kode halaman saya' - tugas itu mengirim HTTP ke server Anda. Jika Anda butuh pemrosesan di perangkat saat tertutup, itulah gunanya endpoint pengiriman.
- Simpan otomatis: selalu id tugas yang SAMA. Id berbeda membuat antrean beberapa penyimpanan usang.