Hafif günlük iz defteri — Android. Amaç: nereye ve ne kadar gidildiğinin seyrek, pil dostu kaydı.
Paket: com.dayatlas.app · Dil: Türkçe / English / Deutsch · Sürüm: 0.7.7
Bu depo RideAtlas değildir. RideAtlas sık GPS, canlı harita ve zengin sürüş kaydıdır. DayAtlas ayrı bir ürün: seyrek örnekleme, özet iz, az pil. RideAtlas kodu kopyalanmaz; monorepo yoktur.
İki platform, iki ayrı native uygulama, aynı gün dosyası formatı:
- Android (bu dosyanın geri kalanı) —
app/, Kotlin. - iOS —
ios/, Swift/SwiftUI. Kurulum, arka plan modeli ve reboot sonrası devam etme kısıtları için bkz.ios/README.md. Apple'ın platform kuralları yüzünden arka plan tetiklemesi Android'den farklıdır (sabit dakika yerine ~500 m hareket eşiği) — ayrıntı ios/README.md'de. - Web PWA (iPhone Safari / ana ekran) —
web/. Native uygulama kurmadan tarayıcıdan çalışır; Ana Ekrana Ekle ile ikon gibi kullanılır. Aç: https://alid67-git.github.io/DayAtlas/web/ (arka plan GPS Safari’de yok — bkz. web/README.md).
Flutter motoru (~4–8 MB) ve Google Play Services yığını yok. AlarmManager, konum, boot ve pil muafiyeti doğrudan platform API’si. v1 hedefi küçük APK ve kolay bakım. Rota ekranındaki OpenStreetMap haritası (osmdroid) bunun tek istisnası — o da Play Services/API key gerektirmez, bkz. aşağı.
- Opsiyonel günlük mod (Ayarlar): açıkken uygulama veya telefon açılınca onay sormadan bugünün kaydına başlar / devam eder.
- Seyrek GPS: varsayılan 1 dakika (30 sn / 1 / 3 / 5 dk ayarlanabilir). Sürekli location stream yok.
- Gün dosyası: her cihaz yerel takvim günü (
yyyy-MM-dd) ayrı kayıt. Gece yarısında yeni dosya. UTC ile gün bölünmez. - İçerik: zaman damgalı az nokta + mesafe özeti.
files/days/yyyy-MM-dd.jsonve.gpx. - UI: bugün kayıtta mı, mesafe, son nokta saati, başlat/durdur (günlük mod kapalıyken).
- Harita (ana ekranın altı): bugünün / seçilen günün noktaları OpenStreetMap üzerinde çizgi olarak (osmdroid — Play Services yok, API key yok). Oklarla önceki günlere gidilir. Karolar yalnızca uygulama ön plandayken indirilir/çizilir.
- GPX dışa aktarma: araç çubuğundan tek gün veya tarih aralığı + dosya
adı (
.gpxotomatik eklenir); sistem paylaşım ekranı ile kaydet/gönder. Aralıkta her gün ayrı bir<trk>olur, noktaların gerçek UTC zamanı yazılır. - Google Drive / klasör yedek: Ayarlar’dan bir klasör seçin (Drive
önerilir), günlük otomatik yedeği açın. Günde bir kez tüm
days/*JSON+GPX o klasöre kopyalanır; Drive uygulaması buluta senkronlar. Uygulama kaldırıınca yerel veri silinir — yedek klasörü kalır.
Analiz, foto, Android Auto, topo harita, canlı harita/canlı konum takibi, sık GPS. Harita geçmiş bir günün bitmiş rotasını gösterir — RideAtlas'taki gibi canlı, takip eden bir harita değildir.
Harita (osmdroid) ana ekranın altındaki bir ön plan görünüm bileşenidir:
yalnızca MainActivity görünürken karo indirir/çizer (onResume/onPause
ile bağlı). Uygulama arka plandayken harita kodu çalışmaz — sıfır pil,
sıfır ağ (ana ekran açıkken karo indirmesi olabilir). DayAtlas'ın gerçek
arka plan pil maliyeti tamamen SampleService'ten gelir. Canlı konum/
pusula takibi bilerek eklenmedi.
Haritanın üstündeki kartlarda mesafe, son nokta, nokta sayısı, maksimum
hız, ortalama hız ve aktif sürüş süresi gösterilir (DayStatKind /
SpeedStats). Kartlara uzun basıp sürükleyerek sırası değiştirilebilir;
Ayarlar → Harita gün istatistikleri bölümünden hangilerinin
görüneceği seçilir. Hız/süre, GPS sıçramalarını ve duraklamaları (>20 dk
boşluk) dışarıda bırakacak şekilde hesaplanır.
Daha fazla → Yardım — uygulama dilinde açılır; ekranda Türkçe /
İngilizce / Almanca yardım metni arasında geçiş yapılabilir
(HelpActivity, res/raw/help_*.txt). Arayüz dili Ayarlar → Dil.
Her gün zaten files/days/yyyy-MM-dd.gpx olarak yazılır (uygulama içi
depo). Rotalar sekmesinden tek gün veya Aralık GPX ile sistem
paylaşım ekranına verilir (Dosyalar, Drive, e-posta vb.). Dosya adına
.gpx otomatik eklenir; aralıkta her gün ayrı bir <trk> olur (içe
aktaran uygulamaların tek güne yığmaması için), her noktada gerçek UTC
zaman damgası vardır.
OAuth / Google Cloud kurulumu yok. Sistem klasör seçici (SAF) ile bir
klasör seçilir — tercihen Drive’da oluşturduğunuz DayAtlas klasörü.
- Drive uygulamasında boş bir klasör açın.
- DayAtlas → Ayarlar → Yedek klasörü seç → Google Drive → o klasör.
- Günlük otomatik yedek anahtarını açın (ilk açılışta hemen bir yedek dener).
- İsterseniz Şimdi yedekle.
Sonrasında günde en fazla bir kez (uygulama açılışı veya GPS örneği
sırasında) yalnızca yeni/değişen yyyy-MM-dd.json / .gpx dosyaları
klasöre kopyalanır — zaten yedeklenmiş, değişmemiş dosyalar tekrar
yüklenmez. İlk tam yedek tamamlandıktan sonra günlük otomatik yedek
artık tüm geçmişi taramaz, yalnızca bugünün dosyasına bakar (eski
günler zaten yukarıda ve kendiliğinden değişmez). Bir klasör yeniden
seçildiğinde bu tam tarama bir kez daha yapılır. Drive istemcisi
klasörü buluta senkronlar. Uygulamayı kaldırmak yerel kaydı siler;
Drive’daki kopyalar kalır.
Geri yükleme (yeni telefon veya uygulamayı silip yeniden kurduktan
sonra): Ayarlar → Yedek klasörü seç ile aynı klasörü seçin, sonra
Yedekten geri yükle’ye dokunun. Klasördeki tüm .json gün kayıtları
telefona kopyalanır (aynı isimli yerel dosyaların üzerine yazılır).
AlarmManager.setExactAndAllowWhileIdlebir sonraki örneği planlar (tam alarm yoksasetAndAllowWhileIdle).- Alarm
SampleReceiver→ kısa ömürlüSampleService(foreground typelocation). - Servis
LocationManager.getCurrentLocationile tek nokta alır (Play Services yok), gün dosyasına yazar, kendini kapatır. - WorkManager kullanılmaz (minimum periyot 15 dk; 30 sn–5 dk için uygun değil).
Kısa FGS, sürekli yüksek frekanslı servis değildir. Doze altında kısa aralıklar (özellikle 30 sn / 1 dk) tam tutmayabilir; pil muafiyeti bunu iyileştirir.
| İzin | Neden |
|---|---|
| Konum (kesin / yaklaşık) | Nokta almak |
Her zaman izin ver (ACCESS_BACKGROUND_LOCATION) |
Ekran kapalıyken / arka planda örnek |
| Bildirimler (Android 13+) | Kısa FGS bildirimi (zorunlu) |
| Pil optimizasyonu muafiyeti | Alarm’ın uyku modunda çalışması |
Tam alarm (SCHEDULE_EXACT_ALARM) |
30 sn–5 dk aralığına yaklaşmak |
Sistem izin pencereleri kaçınılmazdır. Günlük mod açıkken “kayıt başlasın mı?” diye sormayız.
BOOT_COMPLETED ile günlük mod açıksa kayıt sessizce yeniden planlanır. Birçok üretici bunu keser:
| Üretici | Tipik ayar |
|---|---|
| Xiaomi / HyperOS / MIUI | Otomatik başlat, pil tasarrufu istisnası |
| Huawei / Honor | Korumalı uygulamalar, “manuel olarak yönet” |
| Oppo / Realme / ColorOS | Uygulama başlatma / arka plan dondurma |
| Samsung | Uyku modu / kullanılmayan uygulamaları derin uyutma — DayAtlas’ı hariç tut |
| OnePlus | Pille optimize etme, otomatik başlat |
Pil bitip telefon açılınca: kilidi açın (dosyalar kullanıcı şifresine bağlı), uygulamayı bir kez açmanız gerekebilir. OEM “otomatik başlat” kapalıysa BootReceiver hiç çalışmaz — bu Android sınırıdır, uygulama aşamaz.
Ayarlar ekranında, cihaz üreticisi yukarıdaki listede tanınıyorsa bir “Otomatik başlatmayı aç” düğmesi belirir; bu düğme o üreticinin otomatik başlatma/korumalı uygulamalar ekranına doğrudan götürür (dokümante edilmemiş sistem ekranlarına best-effort deep link — bulunamazsa kullanıcıyı üretici ayarlarında elle aramaya yönlendirir). İzni açık hâle getirmek yine kullanıcının elinde; uygulama bunu zorlayamaz.
DayAtlas görev değiştiricide kart bırakmamaya çalışır. Yalnızca
excludeFromRecents bazı OEM arayüzlerinde (Samsung One UI) yetmediği
için, UI arka plana geçince görev de sonlandırılır
(AppTask.finishAndRemoveTask). Bu, listede görünmeyen uygulamaların
yaptığı şeyle aynı sınıftır: bayrak yetmezse görevi gerçekten kaldırmak.
- Yeniden açmak için ana ekran simgesini kullanın (görev değiştiricide kart olmaz).
- Günlük kayıt bundan etkilenmez — örnekleme AlarmManager + kısa
SampleServiceile activity'den bağımsız sürer. - Sistem izin / Ayarlar / OEM otomatik-başlat ekranlarına giderken görev bilinçli olarak tutulur; o ekranlardan Geri ile dönüş çalışır.
- Bildirim, konum göstergesi, Ayarlar'daki uygulama kaydı gibi şeffaflık öğeleri bilerek değiştirilmez — yalnızca görev değiştirici kartı.
RideAtlas/MediaAtlas ile aynı kurgu: CI (android.yml) her main push’unda
DayAtlas.apk’yi tek bir rolling android-latest GitHub release’ine
yüklüyor. Uygulama her gün yerel saat 12:00’te (UpdateCheckScheduler /
UpdateCheckReceiver) bu release’i sessizce kontrol eder; daha yeni bir
sürüm varsa indirmeye başlar. GPS kaydından bağımsızdır (kayıt kapalıyken
de alarm çalışır). Öğleden sonra süreç açılırsa veya örnekleme tick’i
gelirse, o gün henüz kontrol edilmediyse yedek catch-up yapılır (günde bir). Ayarlar’daki “Güncellemeleri kontrol et” her zaman elle çalışır.
release build tipi, repoya bilerek commit edilmiş sabit bir keystore ile
imzalanıyor (app/dayatlas-debug.keystore) — Android'in kendiliğinden
oluşturduğu varsayılan debug anahtarıyla değil. O varsayılan anahtar her CI
runner'ında sıfırdan üretildiği için, onunla imzalarsak her CI derlemesi
farklı bir anahtarla çıkar ve Android imzası eşleşmeyen bir APK'yı
"güncelleme" olarak kabul etmez (indirme biter, kurulum sessizce başarısız
olur). Sabit keystore bunu çözer; RideAtlas/MediaAtlas'ta da aynı kurgu var.
Sideload-only bir anahtar (Play Store için değil), commit edilmesi bu yüzden
sorun değil.
Kurulum anında Android’in kendi “bu uygulamayı yükle” ekranı yine de çıkar — bu işletim sistemi kısıtıdır, hiçbir normal (root olmayan) uygulama atlayamaz. Ayarlar’da elle kontrol için de bir düğme var; o akış bulduğunda indirmeden önce sorar. Debug-keystore ile imzalı sideload build’dir, Play Store’a yayın için değildir.
JDK 17 + Android SDK (compile/target SDK 35).
./gradlew assembleDebug assembleReleaseWindows: gradlew.bat assembleDebug
APK:
- Debug:
app/build/outputs/apk/debug/ - Release:
app/build/outputs/apk/release/(v0.1 debug keystore ile imzalı; üretim keystore sonra)
CI her push’ta aynı APK’ları artifact olarak yükler.
playRelease (imzalı .aab, PAYWALL_ENABLED=true, self-update kapalı)
yerelde keystore.properties gerektirir (bkz. keystore.properties.example)
— bu dosya ve işaret ettiği .keystore asla commit edilmez (.gitignore).
Yerel Android SDK/Studio olmadan üretmek için .github/workflows/play-release.yml
elle tetiklenen bir GitHub Actions iş akışıdır. Bir kerelik kurulum:
- Repo → Settings → Secrets and variables → Actions → New repository secret,
dört secret ekleyin:
PLAY_KEYSTORE_BASE64—.keystoredosyasının base64 hâli (base64 -i dayatlas-play-release.keystore | pbcopymacOS,base64 -w0 dayatlas-play-release.keystoreLinux — çıktıyı secret'a yapıştırın)PLAY_KEYSTORE_STORE_PASSWORD,PLAY_KEYSTORE_KEY_ALIAS,PLAY_KEYSTORE_KEY_PASSWORD—keystore.properties'teki değerlerin aynısı
- Actions sekmesi → Build Play Store release (.aab) → Run workflow.
- Tamamlanan run'ın Artifacts bölümünden
DayAtlas-playRelease-aab'yi indirip içindeki.aab'yi Play Console'a yükleyin.
Keystore hiçbir zaman repoya veya commit geçmişine girmez — runner'da geçici olarak decode edilir, derlemede kullanılır, iş bitince silinir.
- Debug APK kur, uygulamayı aç.
- Konum: Her zaman izin ver. Pil: optimize etme. Gerekirse tam alarm izni.
- OEM ise “otomatik başlat”ı aç.
- Ayarlar → Günlük mod açık, aralık 1 dk (hızlı deneme için 30 sn).
- Ana ekranda “Günlük mod — otomatik kayıt”, mesafe/son nokta bir süre sonra dolmalı. Onay diyaloğu olmamalı.
- Dosyalar:
adb shell run-as com.dayatlas.app ls files/days
yyyy-MM-dd.jsonve.gpxbeklenir. JSONdatealanı yerel gündür. - Reboot: günlük mod açıkken yeniden başlat, kilidi aç, ~bir aralık bekle. Uygulama açılmadan nokta düşmeli (OEM izin veriyorsa). Düşmezse otomatik başlat/pil ayarını kontrol et; README’deki beklenti budur, garanti değil.
- Günlük modu kapat: kayıt durur. Manuel Başlat / Durdur görünür. Gece yarısı yine yerel güne göre yeni dosya.
JSON özeti:
{
"version": 1,
"date": "2026-08-28",
"title": "Günlük 28 Ağu 2026",
"distanceMeters": 1234.5,
"points": [{ "t": 1756512000000, "lat": 41.01, "lon": 29.02, "acc": 12.3 }]
}t Unix milisaniye (anlık zaman). Gün anahtarı yerel takvim tarihidir.
MIT — bakınız LICENSE.