Phonegap failed to start geolocation service

Usando PhoneGap nelle nostre applicazioni mobile è quasi certo trovarsi, prima o poi, davanti a questo messaggio:
failed to start geolocation service.
Il messaggio compare nella console di Eclipse quando cerchiamo di utilizzare la geolocalizzazione dall’emulatore. Per risolvere il problema ci sono tante guide online, ma per usarle proficuamente ci vuole molta pazienza, serve una certa dimestichezza e non sempre una soluzione funziona su tutti gli emulatori e su tutti i PC. Insomma si tratta, sostanzialmente, di un problema non risolvibile.

C’è però un workaround, cioè un modo per aggirare il problema senza cercare di risolverlo.
Innanzitutto precisiamo che il problema è causato dalle seguenti righe di codice che, in modo o nell’altro, devono essere presenti nella nostra applicazione:

var options = {maximumAge:0, timeout:30000, enableHighAccuracy:false};
navigator.geolocation.getCurrentPosition(onGeoSuccess, onGeoError, options);

In rete si trovano i seguenti rimedi che però, come detto, funzionano a volte si e a volte no…

  1. nel codice sopra, impostiamo enableHighAccuracy su true
  2. da Eclipse lanciamo l’emulatore
  3. partito l’emulatore, entriamo nella perspective DDMS e scegliamo la voce “emulator”
  4. poi, in basso, inseriamo le coordinate di nostro gradimento e premiamo sul bottone “Send”

Ecco un’indicazione grafica di come eseguire gli ultimi due punti.
Perspective DDMS
Invio coordinate

In questo modo riusciamo a bypassare il failed to start geolocation service, ma poi se interagiamo con le google maps (cosa quasi certa) ci ritroveremo a dover affrontare altri problemi, come il ZERO_RESULT del Geocoder e così via. Tramite gli espedienti visti sopra, insomma, non se ne esce facilmente.
Quello che però possiamo fare è commentare le righe di codice viste sopra (in fase di test sull’emulatore) e sostituirle con codice fittizio che “geolocalizza” il nostro emulatore. Possiamo quindi creare una funzione ad hoc da utilizzare al posto delle righe precedenti. In tale funzione avvaloreremo tutte le variabili che ci servono e che, normalmente, verrebbero avvalorate dal Geocoder.

function daCancellare() {
// qui avvaloriamo le nostre variabili. Ad esempio:
cap = 10100;
city = "Roma";
// eccetera, eccetera
}

daCancellare();
//var options = {maximumAge:0, timeout:30000, enableHighAccuracy:false};
//navigator.geolocation.getCurrentPosition(this.onGeoSuccess, this.onGeoError, options);

Se invece vogliamo assolutamente che tutto funzioni regolarmente nel nostro emulatore… beh… buona fortuna! 😀
In giro per la rete troveremo decine e decine di suggerimenti… quasi tutti inutili.

Hai letto questi articoli?