Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


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?

3 Solutions collect form web for “Cordova Geolocalización plugin devolver objeto de posición vacía en Android”

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) 
FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.