2015-10-01 2 views
6

Ich hatte einige Probleme mit dem Geolocation Cordova Plugin (org.apache.cordova.geolocation). Es funktioniert gut auf iOS, aber es funktioniert überhaupt nicht auf Android.Cordova Geolocation Plugin Rückgabe leeres Objekt auf Android

Wie ich verstehe, verwendet das Plugin ursprünglich nativen Android-Code, aber das wurde irgendwann entfernt, weil es zu buggy/langsam war und die native Web-HTML5-Implementierung war viel stabiler und schneller.

Wenn ich die neueste Plugin-Version (0.3.2) verwende, die immer noch den nativen Code hat, funktioniert es (aber langsam und in der Tat nicht immer). Wenn es jedoch zurückkehrt, wird das Positionsobjekt immer ausgefüllt.

Wenn ich die neueste Plugin-Version (1.0.1) verwende, kehrt die getCurrentPosition() sofort mit einem leeren Objekt ({}) zurück. Es wird kein Fehler ausgegeben.

Wenn ich das Plugin vollständig entfernen und die Berechtigungen manuell auf das Android-Projekt hinzufügen:

<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" /> 

Das gleiche geschieht. Ich kann es einfach nicht zur Arbeit bringen, aber es ergibt keinen Sinn. In der Android-Konsole werden keine Fehler angezeigt. Irgendwelche Gedanken?

Antwort

21

OK, nach einer langen Zeit des Debuggens habe ich das Problem gefunden. Offenbar gibt die Funktion getCurrentPosition() ein spezielles Objekt in Android zurück, das bei Verwendung von JSON.stringify() zu {} führt. Wenn ich das rohe Rückgabe-Objekt an die Konsole ausgegeben habe, stellte sich heraus, dass es überhaupt nicht leer war.

Also, folgende lächerlich Anpassung meinen Code festgelegt:

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 funktioniert gut, ohne über Anpassungen, aber wie mein app eine Phonegap Anwendung ist, wende ich immer das oben.

+1

Dank dafür. Es stellt sich heraus, dass "coords" und "timestamp" 'Geolocation'-Prototyp-Getter sind und ich denke, dass' JSON.stringify' nur die Eigenschaften eines Objekts ausgibt. –

2

Das Geolocation Objekt an die Rückrufe in navigator.geolocation.getCurrentLocation() bestanden enthält zwei Prototyp Getter coords und timestamp, was bedeutet, dass hasOwnProperty falsch zurück, die ich, dass JSON.stringify umfasst nicht annehmen.

Bei der Anmeldung alle Schlüssel auf dem Objekt ich folgendes erhalten:

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

Nie weniger, wobei diese Werte gültig sind, wenn sie normal abgerufen.

+0

Das klärt die Angelegenheit. Vielen Dank! –

0

mit kantigem, können Sie dies mit fix:

location = angular.copy(location)