alsperGIS



GNSS > Geolocalizzazione con smartphone

Problemi GNSS in background



(In questa pagina sono riportate osservazioni personali relative al problema trattato. Potrebbero esserci informazioni errate, imprecise o incomplete. Vedrò di tenere aggiornata la pagina con eventuali correzioni e nuove informazioni appena ne avrò)



Durante alcune prove fatte con lo smartphone Xiaomi Mi 8 (con sistema MIUI 10.2) per registrare i dati GNSS mediante l'app rinex ON (versione 1.2.1 aggiornata l'11/02/2019) mi sono accorto che la registrazione si interrompe quando il display si spegne o l'applicazione usata va in background.

Ovviamente ho cercato in internet informazioni per permettere alle app di lavorare in background ed ho trovato alcune cose da settare con MIUI 10:
- Impostazioni > Batteria e prestazioni > Scegli le applicazioni (Risparmio della batteria in background) > selezionare l'app desiderata > selezionare Nessuna restrizione
- Impostazioni > App installate > selezionare l'app desiderata > Permessi > controllare che Geolocalizzazione sia abilitata
- Impostazioni > App installate > selezionare l'app desiderata > Altri permessi > controllare che Avvio in background sia abilitato
Ho anche provato a bloccare (lock) l'app nella schermata di visualizzazione visualizzazione delle app recenti...
... ma è stato tutto inutile.

Poi ho scoperto che dalla versione 8 di Android la comunicazione tra un'app in background ed i dati GNSS rischia di essere interrotta. Come si legge all'inizio della pagina https://developer.android.com/about/versions/oreo/background-location-limits:
"In an effort to reduce power consumption, Android 8.0 (API level 26) limits how frequently background apps can retrieve the user's current location. Apps can receive location updates only a few times each hour." Traduzione: nel tentativo di ridurre il consumo di alimentazione, Android 8.0 (API level 26) limita la frequenza con cui un'app in background può ricevere la localizzazione corrente dell'utente. (Di conseguenza) le apps (in background) ricevono aggiornamenti sulla localizzazione solo poche volte ogni ora.
E più sotto:
"When your app is in the background, callbacks that are registered to receive outputs from GnssMeasurement and GnssNavigationMessage stop executing." Traduzione: quando la tua app è in background, le funzioni callback registrate per ricevere output da GnssMeasurement e GnssNavigationMessage non vengono eseguite.

In pratica quando un'app che registra i dati GNSS viene messa in background il modulo GNSS potrebbe interrompere la comunicazione anche se l'app è impostata dall'utente per lavorare in background. Questo è ciò che avviene ad esempio con rinex ON e con le versioni vecchie di Geo++ RINEX Logger.

Cercando in internet ho trovato la possibilità di settare in alcuni sistemi un'opzione apposita per consentire la geolocalizzazione in background (allow background location) a volte nelle impostazioni GPS, altre volte in quelle della batteria o in quelle relative ad ogni singola app. Purtroppo nella MIUI 10 del mio Mi 8 non ho trovato da nessuna parte opzioni specifiche per la localizzazione in background.

(mi viene da dire: più andiamo avanti, più andiamo indietro!)


Tuttavia esistono alcune app che riescono a forzare la comunicazione con il modulo GPS/GNSS anche quando sono in background o a display spento. Inoltre quando queste applicazioni sono in funzione (anche in background o a scermo spento) tengono attivo il modulo GPS/GNSS che quindi rimane parzialmente accessibile anche alle altre app che altrimenti non protrebbero ottenere dati di localizzazione.
Una di queste app è GPSLogger (sviluppatore: Mendhak; https://play.google.com/store/apps/details?id=com.mendhak.gpslogger, https://gpslogger.app/) che può registrare le posizioni in vari formati (csv, gpx, kml, geojson, nmea) a distanze di tempo e/o spazio impostabili. Quando la registrazione è attiva anche le altre app riescono ad accedere parzialmente ai dati GNSS.
Perché dico parzialmente? vediamo un caso concreto: GPSLogger + rinex ON.
Rinex ON salva sia i dati di geolocalizzazione in formato NMEA sia i dati GNSS grezzi in formato RINEX 3.03 con intervallo temporale di 1 secondo, ma solo quando l'app è in primo piano e con schermo attivo. Se, durante la registrazione, per un certo intervallo di tempo l'app viene messa in background o lo schermo si spegne allora si perde la comunicazione con il modulo GNSS ed i dati non vengono registrati (di conseguenta rimane un buco relativo a quell'intervallo nei log NMEA e RINEX prodotti). Quando poi l'app viene riportata in primo piano o si riattiva lo schermo, l'acquisizione dei satelliti ricomincia da zero e servono alcuni secondi prima di riottenere la posizione. Se però è attiva contemporaneamente la registrazione di GPSLogger allora rinex ON continua a registrare i dati in formato NMEA, anche in background e a schermo spento, ma NON registra i dati grezzi in formato RINEX; inoltre la registrazione dei dati NMEA da parte di rinex ON avviene ad intervalli di tempo dipendenti dall'intervallo impostato in GPSLogger (è però possibile ottenere una registrazione più accurata attivando in GPSLogger l'opzione per tenere il GPS sempre attivo).
Quindi GPSLogger mantiene attiva la comunicazione dei dati di localizzazione già calcolati, ma non dei dati grezzi.


Esistono inoltre app pensate proprio per tenere il modulo GNSS attivo e permettere alle altre app di comunicare con esso. Ecco quelle che ho provato:

- GPS Connected (https://play.google.com/store/apps/details?id=org.bruxo.gpsconnected). Sviluppatore: Diogo Ferreira. Non è indicata una pagina internet di riferimento ma l'app è molto semplice : LOCK GPS per mantenere sempre attivo il modulo GNSS e UNLOCK GPS per liberarlo.
  Versione provata: 1.16, aggiornata: 15/01/2019. Permette a rinex ON di registrare i dati NMEA ma NON pernette di registrare i dati grezzi in formato RINEX.

- GPS Locker (https://play.google.com/store/apps/details?id=com.silentlexx.gpslock, http://lexxlinux.blogspot.com/). Sviluppatore: SilentLexx. Purtroppo il sito (blog) dello sviluppatore è in cirillico. La versione gratuita contiene annunci pubblicitari.
  Versione provata: 2.2.3, aggiornata: 16/01/2019. Permette a rinex ON di registrare i dati NMEA ma NON pernette di registrare i dati grezzi in formato RINEX.

- GPS Fix (https://play.google.com/store/apps/details?id=com.a13.gpslock). Sviluppatore: A13 Software Development. Non è indicata una pagina internet di riferimento. Contiene annunci pubblicitari.
  Versione provata: 1.1.0, aggiornata: 30/09/2018. Permette a rinex ON di registrare i dati NMEA ma NON pernette di registrare i dati grezzi in formato RINEX.

Quindi le app pensate per tenere attivo il GPS/GNSS non mantengono la comunicazione dei dati grezzi



AGGIORNAMENTO 29-03-2019: l'app Geo++ RINEX Logger versione 2.1 aggiornata il 21-03-2019 è ora in grado di registrare in formato RINEX 3.03 anche in background. Dalle prime prove che ho fatto con dispusitivo Xiaomi Mi8 (MIUI 10) funziona anche a schermo spento.



Questo il riepilogo di quanto ho capito:

Perché un'app possa registrare i dati GPS/GNSS anche in background e/o con display spento è necessario che:
1 - l'app abbia i permessi di "Geolocalizzazione" ed "Avvio in background" (questi permessi vengono impostati automaticamente dall'app chiedendo il consenso all'utente),
2 - l'app non abbia restrizioni nelle impostazioni per il risparmio batteria (su MIUI 10 va fatto manualmente: Impostazioni > Batteria e prestazioni > Scegli le applicazioni (Risparmio della batteria in background) > selezionare l'app desiderata > selezionare Nessuna restrizione),
3 - l'app deve essere sviluppata per tenere attiva la comunicazione GPS/GNSS anche in background o con display spento (questo deve essere fatto dallo sviluppatore dell'app).

Se il punto 3 non è rispettato lo si può aggirare parzialmente usando una delle varie app pensate per tenere attiva la comunicazione GPS/GNSS. Tuttavia queste app tengono attiva solo la comunicazione dei dati già calcolati ma non dei dati grezzi.

Al momento (29-03-2019) l'unica app che ho trovato in grado di registrare dati grezzi in formato RINEX anche in background è Geo++ RINEX Logger.







Marzo 2019
Alessandro Perego