Phonegap / Cordova地理位置无法在Android上运行

时间:2013-10-21 10:21:22

标签: android cordova geolocation

我很难让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' ]

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

14 个答案:

答案 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)

  • 检查您的config.xml文件。

删除此行

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

检查所有<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
  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
        }
    });

答案 13 :(得分:-1)

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

{ enableHighAccuracy: true }

在getCurrentPosition()上并打开genymotion的gps。