2015-10-01 15 views
6

Ho riscontrato alcuni problemi con il plug-in Cordova di geolocalizzazione (org.apache.cordova.geolocation). Funziona bene su iOS, ma non funziona affatto su Android.Plugin di geolocalizzazione di Cordova che restituisce l'oggetto posizione vuota su Android

Come ho capito, il plug-in utilizzato per includere il codice Android nativo, ma questo è stato rimosso ad un certo punto, perché era troppo bacato/lento e l'implementazione HTML5 nativa web era molto più stabile e veloce.

Se utilizzo l'ultima versione del plug-in (0.3.2) che ha ancora il codice nativo, funziona (ma lento e, in effetti, non sempre). Ma quando ritorna, l'oggetto posizione è sempre popolato.

Se utilizzo l'ultima versione del plug-in (1.0.1), getCurrentPosition() restituisce immediatamente un oggetto vuoto ({}). Non genera un errore.

Se rimuovo il plugin completamente, e aggiungere le autorizzazioni manualmente al progetto Android:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> 

la stessa cosa accade. Non riesco a farlo funzionare, ma non ha senso. Nessun errore viene visualizzato nella console Android. qualche idea?

risposta

21

OK, dopo un lungo lungo tempo di debug, ho trovato il problema. Apparentemente, la funzione getCurrentPosition() restituisce un oggetto "speciale" in Android, che valuta {} quando si utilizza JSON.stringify(). Se ho trasmesso l'oggetto grezzo restituito alla console, è risultato che non era affatto vuoto.

Quindi, di seguito ridicole regolazioni fissati il ​​mio codice:

navigator.geolocation.getCurrentPosition(function (position) { 
    var positionObject = {}; 

    if ('coords' in position) { 
     positionObject.coords = {}; 

     if ('latitude' in position.coords) { 
      positionObject.coords.latitude = position.coords.latitude; 
     } 
     if ('longitude' in position.coords) { 
      positionObject.coords.longitude = position.coords.longitude; 
     } 
     if ('accuracy' in position.coords) { 
      positionObject.coords.accuracy = position.coords.accuracy; 
     } 
     if ('altitude' in position.coords) { 
      positionObject.coords.altitude = position.coords.altitude; 
     } 
     if ('altitudeAccuracy' in position.coords) { 
      positionObject.coords.altitudeAccuracy = position.coords.altitudeAccuracy; 
     } 
     if ('heading' in position.coords) { 
      positionObject.coords.heading = position.coords.heading; 
     } 
     if ('speed' in position.coords) { 
      positionObject.coords.speed = position.coords.speed; 
     } 
    } 

    if ('timestamp' in position) { 
     positionObject.timestamp = position.timestamp; 
    } 

    // Use the positionObject instead of the position 'object' 
    alert(JSON.stringify(positionObject));    
} 

iOS funziona bene senza aggiustamenti di cui sopra, ma come la mia app è un'applicazione PhoneGap, ho sempre applicare quanto sopra.

+1

Grazie per questo. Risulta 'coords' e' timestamp' sono getter di prototipazione 'Geolocation' e suppongo che' JSON.stringify' restituisca solo le proprietà di un oggetto. –

2

L'oggetto Geolocation passato al callback in navigator.geolocation.getCurrentLocation() contiene due prototipi getter coords e timestamp, il che significa che hasOwnProperty tornerà falso, che presumo che JSON.stringify esclude.

Quando si accede tutti i tasti sull'oggetto ottengo il seguente:

[object Geoposition] 
    .coords [object Coordinates] 
    .latitude 
    .longitude 
    .altitude 
    .accuracy 
    .altitudeAccuracy 
    .heading 
    .speed 
    .timestamp 
Mai

di meno, questi valori sono validi quando si accede normalmente.

+0

Questo chiarisce la questione. Grazie! –

0

Con angolare, è possibile risolvere questo problema con:

location = angular.copy(location)