Phonegap /cordova地理定位不适用于Android

我在使用模拟器(即使通过telnet进行geo fix )和设备上的Geolocation工作时遇到了麻烦。 适用于iOS,WP8和浏览器。

当我使用下面的代码询问设备的位置时,我总是得到一个错误(在我的情况下自定义Retrieving your position failed for unknown reason. ,错误代码和错误消息都为null

相关代码:

  successHandler = (position) -> resolve App.Location.create lat: position.coords.latitude lng: position.coords.longitude errorHandler = (error) -> error = switch error.code when 1 App.LocationError.create message: 'You haven\'t shared your location.' when 2 App.LocationError.create message: 'Couldn\'t detect your current location.' when 3 App.LocationError.create message: 'Retrieving your position timeouted.' else App.LocationError.create message: 'Retrieving your position failed for unknown reason. Error code: ' + error.code + '. Error message: ' + error.message reject(error) options = maximumAge: Infinity # I also tried with 0 timeout: 60000 enableHighAccuracy: true navigator.geolocation.getCurrentPosition(successHandler, errorHandler, options) 

平台/安卓/ AndroidManifest.xml中

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

www / config.xml(以防万一)

 <feature name="Geolocation"> <param name="android-package" value="org.apache.cordova.GeoBroker" /> </feature> 

使用Cordova 3.1.0。 在Android 4.2上testing 插件安装。 包含在index.html中的Cordova.js(其他插件如InAppBrowser工作正常)。

 $ cordova plugins ls [ 'org.apache.cordova.console', 'org.apache.cordova.device', 'org.apache.cordova.dialogs', 'org.apache.cordova.geolocation', 'org.apache.cordova.inappbrowser', 'org.apache.cordova.vibration' ] 

我无能为力 我错过了什么吗?

Solutions Collecting From Web of "Phonegap /cordova地理定位不适用于Android"

试试这个方法来看看它是否适合你,因为它对我有用:

 var options = { enableHighAccuracy: true }; navigator.geolocation.getCurrentPosition(onSuccess, onError, options); 

尝试这个,

删除地理位置插件

 cordova plugin rm org.apache.cordova.geolocation 

不过,请确保AndroidManifest.xml和config.xml属性保持不变

 (in app/res/xml/config.xml) <feature name="Geolocation"> <param name="android-package" value="org.apache.cordova.GeoBroker" /> </feature> (in app/AndroidManifest.xml) <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" /> 

而在config.xml中的iOS

 <feature name="Geolocation"> <param name="ios-package" value="CDVLocation" /> </feature> 

然后,使用CLI构build应用程序并在设备/仿真器上运行应用程序。 你会发现你现在得到了错误代码以及getlocation的onError消息。

更多信息:甚至在执行上述步骤之后,即使设置了{timeout:10000}也可能会一直收到超时消息。 这个解决scheme非常有趣,只需closures设备并打开它并再次运行应用程序。 你应该感到惊讶,看到工作,就像我一样!

我的解决scheme是使用本地HTML5地理定位支持的android /三星如果它存在:

 // BEFORE the deviceready event has fired: // Check if HTML5 location support exists app.geolocation = false; if(navigator.geolocation) { app.geolocation = navigator.geolocation; } // AFTER the deviceready event: if(app.geolocation) { var locationService = app.geolocation; // native HTML5 geolocation } else { var locationService = navigator.geolocation; // cordova geolocation plugin } locationService.getCurrentPosition( function(pos) { }, function(error) { }, {enableHighAccuracy: true, timeout: 15000} ); 

对于我testing过的所有三星设备,enableHighAccuracy必须是“真实的”才能正常工作。 对于诸如Nexus 7之类的非三星设备,enableHighAccuracy也可以设置为“false”。

使用Phonegap和Genymotion,当我尝试getCurrentPosition时, successHandler从未被调用。 添加选项:

 {enableHighAccuracy: true, timeout: 2*1000, maximumAge: 0} 

为我解决这个问题。

根据https://issues.apache.org/jira/browse/CB-5977,Android插件支持已被删除&#x3002; Yi Ming Kuan说:“我们之所以selectCB-5977,是因为新的Android版本的webview会比原生的API更快地获得GPSlocking,因此将其删除。在Android上添加插件只是增加了使用HTML5地理定位在你的应用程序中“。

  • 检查你的config.xml文件。

删除这一行

 <preference name="permissions" value="none"/> 
  • 看看你的AndroidManifest.xml

检查所有<uses-permission...>行和<uses-sdk...>行位于<application...>标记之前。

之后在手机上手动卸载应用程序并重新安装。

希望有所帮助。

LG

fastrde

我想你是手动添加插件。 使用命令:(严格来说,如果你使用CLI构build)

 phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git 

我和你有同样的问题,但最后我解决了它。

发生这个问题的原因是我们总是使用浏览器的navigator.geolocation.getCurrentPosition函数来定位位置,所以我们必须让app使用cordova本地实现而不是html5。

在这个线程是很多很好的答案,thx给大家。 如果遇到同样的情况,我想添加我的解决scheme。

当我在我的Nexus上启动我的Cordova 3.5应用程序时,GPS服务没有在此行之后启动:

navigator.geolocation.watchPosition(...);

相反,我得到这个消息:

 07-02 14:31:09.932: D/PluginManager(27767): exec() call to unknown plugin: Geolocation 

我很困惑,因为尽pipe安装了正确的插件,但是根本没有Java Geolocation.java文件。

当Natsu回答说Cordova团队决定调用本地浏览器对象时,我cordova_plugins.js的Geolocation插件:

 ... { "file": "plugins/org.apache.cordova.geolocation/www/Position.js", "id": "org.apache.cordova.geolocation.Position", "clobbers": [ "Position" ] } /*---- , { "file": "plugins/org.apache.cordova.geolocation/www/geolocation.js", "id": "org.apache.cordova.geolocation.geolocation", "clobbers": [ "navigator.geolocation" ] } ----*/ , { "file": "plugins/org.apache.cordova.splashscreen/www/splashscreen.js", "id": "org.apache.cordova.splashscreen.SplashScreen", "clobbers": [ "navigator.splashscreen" ] }, ... 

其余的插件安装保持不变。 像这样,原来的Chrome对象不会被破坏,一切正常。

我现在有点不确定为什么插件安装程序添加JSON条目,虽然它会导致故障。 我想这只是一个devise上的弱点,现在无法纠正(…或者我应该深入到插件安装深入挖掘)。

编辑:不要忘记取消注释元数据:

 // "org.apache.cordova.geolocation": "0.3.8", ... 

如果错误代码是3,请validation设置中的位置是否已启用。 这是为我工作。

在清单文件中添加下面的权限解决了我的问题

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