20

我无法在模拟器(即使我geo fix通过 telnet 上)和设备上让 Geolocation 在 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)

平台/android/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>

使用科尔多瓦 3.1.0。在安卓 4.2 上测试。已安装插件。包含在 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' ]

我一无所知。我错过了什么吗?

4

14 回答 14

15

以这种方式尝试选项,看看它是否对你有用:

var options = { enableHighAccuracy: true };

navigator.geolocation.getCurrentPosition(onSuccess, onError, options);
于 2014-03-26T14:51:26.800 回答
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" />

对于 config.xml 中的 iOS

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

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

更多信息:即使在执行上述步骤之后,即使在设置{timeout:10000}. 解决方案很有趣,只需关闭设备并打开它并再次运行应用程序即可。就像我一样,您应该会惊讶地发现它的工作原理!

于 2014-03-13T10:24:29.507 回答
6

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

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

为我解决了这个问题。

于 2014-07-30T20:05:59.070 回答
6

我的解决方案是使用对 android/samsung 的原生 HTML5 地理定位支持(如果存在):

// 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 必须是“真实的”才能正常工作。对于 Nexus 7 等非三星设备,enableHighAccuracy 也可以设置为“false”。

于 2014-04-30T07:25:29.297 回答
3

根据https://issues.apache.org/jira/browse/CB-5977,Android 插件支持已被删除。Yi Ming Kuan 说:“我们选择 CB-5977 的原因是,较新的 Android 版本上的 webview 会比原生 API 更快地获得 GPS 锁定,因此将其删除。在 Android 上添加插件只是添加了使用 HTML5 Geolocation 的必要权限在你的应用程序中。”

于 2014-06-25T14:01:23.493 回答
2
  • 检查您的 config.xml 文件。

删除这一行

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

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

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

希望有帮助。

lg

快速

于 2013-11-06T21:34:02.947 回答
2

经过大量搜索,我终于找到了一种可以获取用户位置的方法实际的问题是,当您调用该方法时
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
  1. 第二种方法是使用名为cordova-plugin-request-location-accuracy 的插件
    安装它
    $ 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
        }
    });

于 2019-12-20T06:08:28.180 回答
1

我认为您正在手动添加插件。使用命令:(严格来说,如果您使用的是 CLI 构建)

phonegap local plugin add https://git-wip-us.apache.org/repos/asf/cordova-plugin-geolocation.git
于 2013-11-06T12:30:25.607 回答
0

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

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
于 2014-10-08T00:34:57.210 回答
0

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

于 2014-09-24T16:40:00.427 回答
0

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

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

于 2014-05-01T16:50:22.103 回答
0

在这个线程中有很多很好的答案,谢谢大家。我想添加我的解决方案以防 sb 遇到相同的情况。

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

navigator.geolocation.watchPosition(...);

相反,我收到了这条消息:

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

我很困惑,因为尽管正确安装了插件,但根本没有 JavaGeolocation.java文件。

Natsu 的回答清楚地表明 Cordova 团队决定调用本浏览器对象时,我在以下位置注释掉了 Geolocation 插件cordova_plugins.js

...
{
    "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",
...
于 2014-07-02T13:15:00.477 回答
0

cordova-plugin-geolocation 最新版本存在问题。试试下面的版本

<plugin name="cordova-plugin-geolocation" spec="2.4.3" />
于 2019-03-22T07:29:47.317 回答
-1

与https://github.com/apache/cordova-plugin-geolocation有同样的问题。通过更改此配置解决了它

{ enableHighAccuracy: true }

在 getCurrentPosition() 上并为 genymotion 开启 gps。

于 2018-02-08T16:02:29.617 回答