我很难让Geolocation在两个模拟器上(即使我通过telnet geo fix
)和设备上运行Android。适用于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上测试。已安装插件。 Cordova.js包含在index.html中(像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' ]
我很无能为力。我错过了什么吗?
答案 0 :(得分:15)
以这种方式尝试选项以查看它是否适合您:
var options = { enableHighAccuracy: true };
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
答案 1 :(得分:6)
试试这个,
删除地理位置插件
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" />
对于app.xml中的iOS
<feature name="Geolocation">
<param name="ios-package" value="CDVLocation" />
</feature>
然后,使用CLI构建应用程序并在设备/模拟器上运行应用程序。您会发现现在获取错误代码以及getlocation的错误消息。
更多信息:即使执行了上述步骤,即使您设置了{timeout:10000}
,也可能会始终获得超时消息。对此的解决方案非常有趣,只需关闭设备并打开它并再次运行应用程序。你应该感到惊讶,就像我一样工作!
答案 2 :(得分:6)
我的解决方案是使用原生的HTML5地理定位支持android / samsung如果它存在:
// 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}
);
对于我测试过的所有三星设备,enableHighAccuracy必须是真实的&#39;为此工作。对于Nexus 7等非三星设备,启用高精度可以设置为“假”。同样。
答案 3 :(得分:5)
使用Phonegap和Genymotion,当我尝试 getCurrentPosition 时, successHandler 从未被调用过。添加选项:
{enableHighAccuracy: true, timeout: 2*1000, maximumAge: 0}
为我解决了这个问题。
答案 4 :(得分:3)
根据https://issues.apache.org/jira/browse/CB-5977,Android插件支持已被删除。 Yi Ming Kuan说:“我们选择使用CB-5977的原因是新版Android版的webview将比原生API更快地获得GPS锁定,因此将其删除。在Android上添加插件只会增加使用HTML5地理位置的必要权限在你的应用程序中。“
答案 5 :(得分:2)
删除此行
<preference name="permissions" value="none"/>
检查所有<uses-permission...>
行和<uses-sdk...>
行是否位于<application...>
标记之前。
之后,在手机上手动卸载应用程序并重新安装。
希望有所帮助。LG
fastrde
答案 6 :(得分:1)
我认为您手动添加插件。使用命令:(严格来说,如果您使用CLI构建)
phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
答案 7 :(得分:0)
我和你有同样的问题,但最后我已经解决了。
出现这个问题的原因是我们总是使用浏览器的navigator.geolocation.getCurrentPosition函数来定位postion,所以我们必须让app使用cordova本机实现而不是html5。
答案 8 :(得分:0)
在这个帖子中有很多好的答案,对每个人来说都是如此。我想添加我的解决方案,以防遇到相同的情况。
当我在Nexus上启动Cordova 3.5应用程序时,GPS服务在此行之后没有启动:
navigator.geolocation.watchPosition(...);
相反,我收到了这条消息:
07-02 14:31:09.932: D/PluginManager(27767): exec() call to unknown plugin: Geolocation
我很困惑,因为尽管安装了正确的插件,但根本没有Java Geolocation.java
文件。
当answer of 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条目,尽管它会导致故障。我想这只是一个现在无法纠正的设计弱点(...或者我应该深入研究插件安装)。
编辑: 不要忘记取消注释元数据:
// "org.apache.cordova.geolocation": "0.3.8",
...
答案 9 :(得分:0)
如果错误代码为3,请验证设置中的位置是否已启用。 这对我有用。
答案 10 :(得分:0)
在清单文件中添加以下权限解决了我的问题
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
答案 11 :(得分:0)
cordova-plugin-geolocation最新版本存在问题。 尝试以下版本
<plugin name="cordova-plugin-geolocation" spec="2.4.3" />
答案 12 :(得分:0)
经过大量搜索,我终于找到了一种获取用户位置的方法
实际的问题是,当您调用方法时
navigator.geolocation.getCurrentPosition(successHandler, errorHandler, options)
如果设备的位置服务未打开,则地理定位将完全无效,即使它具有访问位置的权限也是如此。 我们需要的是开启位置服务 有两种方法可以实现这一目标
第一个是
1.在调用cordova.plugins.diagnostic.switchToLocationSettings()
函数之前,请使用getCurrentPosition()
并手动打开位置
为此,请根据您的操作系统或框架,使用以下一种方式安装名为cordova.plugins.diagnostic的插件
$ cordova plugin add cordova.plugins.diagnostic
$ cordova plugin add cordova.plugins.diagnostic --variable ANDROID_SUPPORT_VERSION=27.+
$ phonegap plugin add cordova.plugins.diagnostic
$ ionic cordova plugin add cordova.plugins.diagnostic
$ cordova plugin add cordova-plugin-request-location-accuracy
cordova.plugins.locationAccuracy.canRequest(function(canRequest){
if(canRequest){
cordova.plugins.locationAccuracy.request(function(){
console.log("Successfully made request to invoke native Location Services dialog");
navigator.geolocation.getCurrentPosition(onSuccess, errorHandler, options)
var onSuccess = function(position) {
alert('Latitude: ' + position.coords.latitude + '\n' +
'Longitude: ' + position.coords.longitude + '\n' +
'Altitude: ' + position.coords.altitude + '\n' +
'Accuracy: ' + position.coords.accuracy + '\n' +
'Altitude Accuracy: ' + position.coords.altitudeAccuracy + '\n' +
'Heading: ' + position.coords.heading + '\n' +
'Speed: ' + position.coords.speed + '\n' +
'Timestamp: ' + position.timestamp + '\n');
};
// onError Callback receives a PositionError object
//
function onError(error) {
alert('code: ' + error.code + '\n' +
'message: ' + error.message + '\n');
}
}, function(){
console.error("Failed to invoke native Location Services dialog");
});
}else{
// request location permission and try again
}
});
答案 13 :(得分:-1)
与https://github.com/apache/cordova-plugin-geolocation有同样的问题。通过更改此配置解决了这个问题
{ enableHighAccuracy: true }
在getCurrentPosition()上并打开genymotion的gps。