当位置模式设置为 "Device only" 时,总是会出现关于地理位置的超时

Timeout about geolocation always reached when position mode is set to "Device only"

我拥有一个 Ionic 应用程序 (Cordova)。

我有这段 JS 代码旨在获取 Android 设备的位置:

$cordovaGeolocation.getCurrentPosition({
                    enableHighAccuracy: true,
                    timeout: 15000
                }) 

$cordovaGeolocation 来自 ng-cordova 库。
我成功检查了插件 org.apache.cordova.geolocation 是否已更新为最新版本。

一些用户抱怨第一次查询多了 15 秒!
请注意,超时设置为 15000 毫秒 => 15 秒。
这意味着设备没有成功建立位置。

经过调查,我发现了问题所在:
这些用户已将他们的位置模式设置为 "Device Only" 或者在他们的设备设置中也调用了 "GPS only"。

当用户切换到 "High Accuracy mode" 时,整个过程不到一秒钟。

如何在不建议用户切换到 "High accuracy mode" 的情况下解决此问题? 这是一个错误吗?

请注意,我也用 enableHighAccuracy: false 进行了测试,但结果相同。

我不是唯一遇到此 "big" 问题的人:
Phonegap - Geolocation with PowerSaving and GPS Only Mode
但无人接听..

我为这个问题纠结了三天,没有解决办法。它只是不起作用而且从来没有。所以我会尝试使用另一种工具,因为 cordova 不适合用于地理定位目的。现在我专注于 java 并且我想正确地做到这一点(ios 是一个奖励,当我选择 cordova 时)。

我一整天都在为同样的问题苦苦挣扎,我发现 android 的 cordova 地理定位插件使用了 WebView 的地理定位功能,不知道为什么,但是对于 WebView 'gps only' 不够。

所以,我开始寻找一些替代方案并找到 https://github.com/louisbl/cordova-locationservices

插件非常棒,但需要 android 播放服务。我已经为地理定位编写了小型 angular 服务:

 multiplatformGeolocation.inject = ['$q'];
    function multiplatformGeolocation ($q) {
        var self = this;

        this.getCurrentPosition = function (opts) {
            var q = $q.defer();

            self.locationModule.getCurrentPosition(function (result) {
                q.resolve(result);
            }, function (err) {
                q.reject(err);
            }, opts || self.positionOptions);

            return q.promise;
        };

        this.init = function () {
            var PRIORITY_BALANCED_POWER_ACCURACY = 102;
            self.positionOptions = {
                timeout: 20000,
                enableHighAccuracy: false,
                priority: PRIORITY_BALANCED_POWER_ACCURACY
            };

            self.locationModule = window.cordova && window.cordova.platformId == 'android' ? LocationServices : navigator.geolocation;
        }
    }

请注意,我使用了 PRIORITY_BALANCED_POWER_ACCURACY,它允许设备在禁用 gps 的情况下使用网络查找当前位置。

我见过你issue on github。 我正在使用 ng-cordova 插件。我使用下面的解决方法让 GPS-only 工作。由于低精度速度更快,超时为4s。

$cordovaGeolocation.getCurrentPosition({enableHighAccuracy: false, maximumAge: MAXAGE, timeout: 4000})
            .then(
                function (position) { //success Low-Accuracy
                    console.log('getCurrentPosition: HighAccuracy false: Ok!');
                    //[..]
                },
                function(err) { //error Low-Accuracy
                    console.log(err);
                    $cordovaGeolocation.getCurrentPosition({enableHighAccuracy: true, maximumAge: MAXAGE, timeout: 10000})
                    .then(
                        function (position) { //success High-Accuracy
                            console.log('getCurrentPosition: HighAccuracy true: Ok!');
                            //[..]
                        },
                        function(err) { //error High-Accuracy
                            console.log('getLocation: ERRO: ' + ERROR[err.code] + ' => ' + err.message);

                            //[..]
                        }
                    );
                }
            );