Allora, il problema qui non è tanto Python o Flask, quanto le limitazioni di Android, specialmente su telefoni come Xiaomi che sono famosi per chiudere in modo aggressivo le app in background per risparmiare batteria. Il messaggio `BackgroundServiceWarning: Location updates paused by OS` è praticamente un blocco deciso dal sistema operativo, non da te.
Usare Python con Flask su Android per un tracking GPS continuo è un po’ come cercare di far nuotare un pesce in un deserto: non è lo strumento giusto, soprattutto perché Python non ha accesso alle API native di Android per gestire i servizi in background. Ti consiglio di virare su uno sviluppo nativo con Kotlin o Java, o almeno usare React Native o Flutter, che hanno plugin dedicati per il background tracking, in grado di aggirare questi blocchi.
Se vuoi restare in Python, valuta di trasformare la parte di tracking in un’app Android nativa con Kivy, ma dovrai comunque gestire permessi e servizi foreground (con notifiche) per evitare che il sistema ti uccida il processo. Anche usare WorkManager o un servizio foreground è praticamente obbligatorio.
Un altro punto: geopy non serve per prendere la posizione GPS, è un geocoder (cioè trasforma coordinate in indirizzi). Devi usare un modulo che acceda direttamente al GPS, come `gpsd` su Linux o, appunto, le API Android.
In sintesi: la soluzione è sviluppare parte dell’app in un ambiente che Android riconosce come “servizio foreground” e non come semplice script Python in background. Sennò ti spegne tutto dopo 10 minuti, che è esattamente quello che ti succede.
Il problema è proprio quello descritto da @kim.147, ovvero le restrizioni imposte da Xiaomi per il risparmio della batteria. La mia esperienza con i servizi in background su dispositivi Xiaomi non è delle migliori, purtroppo. Ho provato a sviluppare un'app con un requisito simile usando Kivy, come suggerito. Tuttavia, anche con Kivy, è fondamentale utilizzare i permessi giusti e gestire le notifiche per mantenere l'app attiva in foreground. Un'alternativa interessante è Flutter, che ha librerie mature per il location tracking in background. Inoltre, se decidi di utilizzare Kivy, assicurati di gestire correttamente i permessi e di impostare un servizio foreground per il tracking GPS.
Grazie Taylor, confermi proprio l'incubo Xiaomi con le restrizioni batteria! 😤 Apprezzo tantissimo i tuoi consigli pratici. Due chiarimenti super rapidi:
1) Per Kivy, hai esempi concreti su come impostare il foreground service con notifica persistente? Temo di fare danni con i permessi
2) Flutter l'ho sempre snobbato per la mia web app, ma se risolve il tracking in background potrei farmi un pensiero... Tu come hai gestito la parte server-side?
Ciao Bene! Su Kivy, per il foreground service devi smanettare con Pyjnius per chiamare le API Android native. Ecco un esempio pratico: usa `from jnius import autoclass, cast` per accedere a `android.app.Service` e `android.content.Context`, poi crea una notifica con `Notification.Builder` e avvia il servizio con `startForeground()`. Importante mettere il permesso `FOREGROUND_SERVICE` e gestire il ciclo del servizio in un thread separato. Ma attenzione: se non hai mai giocato con Java/Objective-C, è una rottura di scatole.
Su Flutter: ho usato il plugin `location` con `androidforegroundservice` per il tracking, e inviavo i dati al server via WebSocket. La parte server-side con Flask funziona tranquilla, basta esporre un endpoint per ricevere le coordinate e gestire le richieste asyncrone. Però se vuoi evitare di riscrivere tutto, potresti integrare solo la parte mobile in Flutter, lasciando il backend Python.
Xiaomi, però, ti costringerà comunque a passare da Developer Options > Battery > Nessuna limitazione manuale per l’app. Altrimenti, nemmeno Gesù ti salva. 😤
@legendgentile Hai centrato il problema tecnico, ma sarò onesta: consigliare Pyjnius a chi non mastica Android nativo è come dargli una Ferrari senza patente. Io ho perso due settimane su quella roba per un progetto simile, e ogni aggiornamento Android ti spacca tutto.
Su Flutter: sì, il plugin `location` è solido, ma preparati a imprecare con la gestione dei permessi su Xiaomi. Quella stronzata di "Nessuna limitazione" nelle opzioni sviluppatore va impostata MANUALMENTE dall'utente finale, e non tutti sono smanettoni.
Benedettarizzo, se il tuo stack è già Python, valuta un ibrido: scrivi solo la parte GPS in Kotlin (con foreground service robusto) e comunichi con Flask via socket. È meno elegante, ma almeno non svegli i vicini bestemmiando alle 3 di notte. Xiaomi è il vero diavolo qui, fidati.