Кордова Плагин геолокации, возвращающий объект пустой позиции на Android

У меня были некоторые проблемы с плагином Geolocation Cordova (org.apache.cordova.geolocation). Он отлично работает на iOS, но на Android он совсем не работает.

Насколько я понимаю, в плагине использовался собственный Android-код, но в какой-то момент он был удален, потому что он был слишком глючным / медленным, а встроенная реализация HTML5 была намного более стабильной и быстрой.

Если я использую последнюю версию плагина (0.3.2), которая по-прежнему имеет собственный код, она работает (но медленно и действительно, не всегда). Но когда он возвращается, объект позиции всегда заполняется.

Если я использую последнюю версию плагина (1.0.1), getCurrentPosition () немедленно возвращается с пустым объектом ({}). Это не вызывает ошибки.

Если я полностью удалю плагин и добавлю разрешения вручную в проект 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" /> 

То же самое происходит. Я просто не могу заставить его работать, но это не имеет смысла. В консоли Android не отображаются ошибки. Есть предположения?

Solutions Collecting From Web of "Кордова Плагин геолокации, возвращающий объект пустой позиции на Android"

Хорошо, после долгого долгого отладки я нашел проблему. По-видимому, функция getCurrentPosition () возвращает «специальный» объект в Android, который оценивает {} при использовании JSON.stringify (). Если я вывел исходный объект возврата на консоль, оказалось, что он не пуст.

Итак, после смешных корректировок мой код:

 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 отлично работает без дополнительных настроек, но поскольку мое приложение является приложением Phonegap, я всегда применяю вышеуказанное.

Объект Geolocation передается обратным coords в navigator.geolocation.getCurrentLocation() содержит два прототипа coords и timestamp , что означает, что hasOwnProperty вернет false, что я предполагаю, что исключение JSON.stringify исключает.

При регистрации всех ключей на объекте я получаю следующее:

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

Тем не менее, эти значения действительны при обычном доступе.

С помощью Angular вы можете исправить это с помощью:

 location = angular.copy(location)