Cordova Geolocalización plugin devolver objeto de posición vacía en Android

He tenido algunos problemas con el complemento Geolocation Cordova (org.apache.cordova.geolocation). Funciona bien en iOS, pero no en absoluto en Android.

Según entiendo, el complemento utilizado para incluir el código de Android nativo, pero esto se eliminó en algún momento, porque era demasiado buggy / lento y la aplicación web nativa HTML5 era mucho más estable y rápido.

Si utilizo la última versión de plugin (0.3.2) que todavía tiene el código nativo, funciona (pero lento y de hecho, no siempre). Pero cuando vuelve, el objeto de posición siempre se rellena.

Si utilizo la versión de plugin más reciente (1.0.1), getCurrentPosition () devuelve inmediatamente con un objeto vacío ({}). No produce un error.

Si elimino completamente el complemento y agrego los permisos manualmente al proyecto de 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" /> 

Lo mismo ocurre. Simplemente no puedo conseguir que funcione, pero no tiene sentido. No se muestran errores en la consola de Android. ¿Alguna idea?

OK, después de un largo tiempo de depuración, encontré el problema. Aparentemente, la función getCurrentPosition () devuelve un objeto 'especial' en Android, que se evalúa a {} cuando se utiliza JSON.stringify (). Si he enviado el objeto de retorno sin procesar a la consola, resultó que no estaba vacío en absoluto.

Así, después de los ajustes ridículos arregló mi código:

 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 funciona bien sin los ajustes anteriores, pero como mi aplicación es una aplicación Phonegap, siempre aplico lo anterior.

El objeto de Geolocation pasó a las devoluciones de llamada en navigator.geolocation.getCurrentLocation() contiene dos colectores de prototipo coords y timestamp , lo que significa que hasOwnProperty devolverá false, que supongo que JSON.stringify excluye.

Al registrar todas las llaves en el objeto consigo lo siguiente:

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

Sin embargo, estos valores son válidos cuando se accede normalmente.

Con Angular, puede solucionar esto con:

 location = angular.copy(location) 
  • ¿Cómo evita que Chrome (o los navegadores de Internet de teléfono en general) en un dispositivo Android sustituyan símbolos de Unicode no estándar por Emojis?
  • ¿Cómo puedo implementar la arquitectura MVC con JQuery móvil
  • Cómo fusionar archivos de audio y video en android
  • Twitter bootstrap tema de Holo
  • Puede una página web en un navegador móvil preguntar / obtener la ubicación de los usuarios desde el teléfono?
  • Redirigir a la aplicación de Android desde un sitio web?
  • ¿Cómo implementar anuncios de admob con Phonegap?
  • Android WebView HTML5 Video Spawns MediaPlayer que vive para siempre en Samsung S4
  • Uso del elemento de entrada de fecha HTML5 con android
  • ¿Cuál es la diferencia entre html5 y xamarin?
  • Almacenamiento Offline de HTML5 con navegadores Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.