Cihaz özellikleri
Sensörler, Dosyalar ve Arka Plan İşleri
BLE fitness sensörlerini eşleyin, FIT/GPX/TCX dosyaları alın, kapalıyken işler çalıştırın
1Diğer uygulamalardan dosya, fotoğraf, video ve bağlantı alın#
Sihirbazda 'Diğer Uygulamalardan Paylaşım Al'ı açın ve uygulamanızın kabul ettiklerini işaretleyin - metin ve bağlantılar, veri dosyaları (FIT, GPX, TCX, CSV, JSON, XML…), fotoğraflar, videolar, ses, belgeler. Uygulamanız tam olarak bu türler için İKİ yerde görünür:
- Kullanıcı bir dosyaya dokunduğunda Android'in 'Birlikte aç' paneli.
- Diğer uygulamaların gösterdiği PAYLAŞ / DIŞA AKTAR paneli - antrenman dosyalarını (.fit, .gpx, .tcx) dışa aktaran spor cihazları dahil. Çoğu fitness uygulaması Paylaş ile dışa aktarır; bu yüzden yalnızca 'Birlikte aç' kaydeden uygulamalar orada hiç görünmez.
Dosyayı AppMint.getOpenedFile() ile isteyin - sayfanız ne kadar geç başlarsa başlasın sizi bekler. f.kind image, video, audio, document veya data olur. Metin biçimleri (gpx, tcx, csv, json, xml…) kullanıma hazır f.text olarak; küçük ikili dosyalar (.fit) f.base64 olarak gelir; her veri dosyası ve belge f.file içinde gerçek bir File olarak gelir. Fotoğraflar, videolar ve ses, <video src> / <img src> için akışa uygun bir adres olan f.url olarak gelir; baytlara ihtiyacınız olduğunda f.getFile() vardır. Boyut sınırı yoktur. Paylaşılan bir bağlantı veya başlık WebToApk.getSharedText() ile okunur.
// 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);2Bluetooth fitness sensörlerini eşleyin (kalp atışı, hız, kadans…)#
Sihirbazda Bluetooth iznini açın ve uygulamanız standart BLE sensörlerini eşleyebilir - uyumlu her göğüs bandı ve bisiklet sensörü aynı resmi Bluetooth profillerini kullanır, bu yüzden marka başına kod gerekmez:
- Kalp atışı bantları → bpm
- Hız/kadans sensörleri → km/sa + pedal devri
- Güç ölçerler → watt
- Koşu ayak sensörleri → tempo + adım/dk
- Her sensörün pil seviyesi
Akış: tara (15 sn) → kullanıcı bir cihaz seçer → bağlan. Veriler daha sonra olaylar olarak akar. Hız için tekerlek boyutunuz gerekir; bir kez ayarlayın (varsayılan 2096 mm = 700x23c yol tekerleği).
// 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();3Arka plan işleri ve kalıcı otomatik kayıt (WorkManager)#
Uygulamanız kapalıyken JavaScript çalışamaz - bu Android'dir, AppMint değil. Çalışabilen şey, sayfanızın işletim sistemine devrettiği yerel bir teslimat işidir. İki araç:
- workEnqueueOnline - kalıcı tek seferlik teslimat. Mükemmel otomatik kayıt: veriyi teslim edin, ağ olduğunda sunucunuza POST eder, geri çekilmeyle yeniden dener, uygulamanın sonlandırılmasından ve yeniden başlatmalardan sağ çıkar. Aynı iş kimliğini yeniden kullanmak bekleyen kaydı en yeni durumla değiştirir.
- workSchedulePeriodic - yinelenen yerel bir HTTP çağrısı (senkron tetikleyici, heartbeat). Android'in asgari aralığı 15 dakikadır; daha kısa değerler yükseltilir.
İkisi de SİZİN verinizi SİZİN URL'nize iletir - sunucu tarafı, zaten sahip olduğunuz normal bir uç noktadır (Supabase edge function, API'niz…).
// 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);
});4Kontrol listesi ve sık yapılan hatalar#
- Dosyalar: anahtar derleme sırasında AÇIK olmalıdır - uygulamanızı, kurulumdan sonra değiştirilemeyen Android manifest'ine kaydeder. Etkinleştirdikten sonra yeniden derleyin.
- BLE: Bluetooth izni anahtarı derleme sırasında AÇIK olmalıdır. İLK tarama, kullanıcıdan çalışma zamanı iznini ister (Android 12+: 'Yakındaki cihazlar'; daha eski: Konum - bu, BLE taraması için bir Android kuralıdır, uygulamanız konumu okumaz).
- BLE: Android'in Bluetooth ayarlarında değil, KENDİ uygulamanızda eşleyin - BLE fitness sensörleri klasik eşleşmiş cihazlar değildir.
- Arka plan işleri: 'sayfa kodumu çalıştır' diye periyodik iş zamanlamayın - sunucunuza HTTP teslim eder. Kapalıyken cihaz üzerinde işlem gerekiyorsa teslimat uç noktası bunun içindir.
- Otomatik kayıt: her zaman AYNI iş kimliği. Farklı kimlikler birden fazla eski kaydı kuyruğa alır.