【问题标题】:Phonegap/Cordova geolocation not working on AndroidPhonegap/Cordova 地理定位无法在 Android 上运行
【发布时间】:2013-10-29 18:56:10
【问题描述】:

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

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

使用 Cordova 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' ]

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

【问题讨论】:

  • 您是否使用 CLI 构建了您的项目?
  • CLI 和 Phonegap 构建。我已经构建了一个简单的应用程序,可以在其中使用 geo,所以今天我将比较有什么不同并更新问题。
  • Kreeki 是否有更多关于此问题的更新?你有没有比较你的构建?
  • 您能否编辑您的标题,使其包含 kony 工作室,因为问题和解决方案是等价的(;,这样您将获得更多观看次数并因此获得积分 xD

标签: android cordova geolocation


【解决方案1】:

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

var options = { enableHighAccuracy: true };

navigator.geolocation.getCurrentPosition(onSuccess, onError, options);

【讨论】:

  • 这为我解决了这个问题,使用 Genymotion 并在工具栏中启用了 GPS。
【解决方案2】:

试试这个,

删除地理定位插件

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},您也可能会始终收到超时消息。解决这个问题的方法很有趣,只需关闭您的设备并打开它并再次运行该应用程序即可。你应该会惊讶地发现它的工作原理,就像我一样!

【讨论】:

  • "只需关闭您的设备并打开它并再次运行该应用程序。"我的上帝....我想这对我来说就是.. Ty
  • ACCESS_COARSE_LOCATION 如果有 ACCESS_FINE_LOCATION 则不需要:developer.android.com/guide/topics/location/…
【解决方案3】:

我的解决方案是使用对 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 必须为“true”才能正常工作。对于 Nexus 7 等非三星设备,enableHighAccuracy 也可以设置为“false”。

【讨论】:

【解决方案4】:

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

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

为我解决了这个问题。

【讨论】:

    【解决方案5】:

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

    【讨论】:

    • 这个解释帮助了我很多,谢谢。所以我可以确保没有其他东西干扰浏览器的原生工作。
    【解决方案6】:
    • 检查您的 config.xml 文件。

    删除这一行

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

    检查所有&lt;uses-permission...&gt; 行和&lt;uses-sdk...&gt; 行是否位于&lt;application...&gt; 标记之前。

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

    希望有帮助。

    lg

    快速

    【讨论】:

    • 谢谢,权限很好。我试过了,但没有帮助。
    【解决方案7】:

    经过大量搜索,我终于找到了一种可以获取用户位置的方法 实际的问题是,当你调用方法时
    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
            }
        });

    【讨论】:

      【解决方案8】:

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

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

      【讨论】:

      • 谢谢,这非常有用。像你说的那样工作。
      【解决方案9】:

      我和你有同样的问题,但我终于解决了。

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

      【讨论】:

        【解决方案10】:

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

        当我在 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 团队决定调用 native 浏览器对象时,我在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",
        ...
        

        【讨论】:

        • 我在 iPhone 上使用插件 "org.apache.cordova.geolocation": "0.3.9"。它仍然无法正常工作。是不是新版本没有修复这个大bug?
        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

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

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

          【讨论】:

            【解决方案13】:

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

            <plugin name="cordova-plugin-geolocation" spec="2.4.3" />
            

            【讨论】:

              【解决方案14】:

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

              { enableHighAccuracy: true }

              打开 getCurrentPosition() 并为 genymotion 开启 gps。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2014-06-16
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-10-19
                • 1970-01-01
                相关资源
                最近更新 更多