Cordova 使用PhoneGap检查GPS是否已启用

Cordova 使用PhoneGap检查GPS是否已启用,cordova,mobile,Cordova,Mobile,我正在使用PhoneGap构建一个应用程序。在使用phonegap的地理位置API时,我意识到API超时有两个原因,并抛出相同的错误: 1.如果用户设备上未启用GPS 2.如果GPS已启用,但无法获取用户的位置(可能有多种原因,GPS故障、天气不清楚等) 我在区分原因方面遇到了问题?你有什么想法吗 我想知道是否有任何方法,我可以使用Phonegap检查用户设备上的GPS是否处于活动状态,这样我就可以作为一个单独的检查,并将用户引导到通常放置地理设置的设置窗口。不知道怎么做?自定义phonegap

我正在使用PhoneGap构建一个应用程序。在使用phonegap的地理位置API时,我意识到API超时有两个原因,并抛出相同的错误: 1.如果用户设备上未启用GPS 2.如果GPS已启用,但无法获取用户的位置(可能有多种原因,GPS故障、天气不清楚等)

我在区分原因方面遇到了问题?你有什么想法吗


我想知道是否有任何方法,我可以使用Phonegap检查用户设备上的GPS是否处于活动状态,这样我就可以作为一个单独的检查,并将用户引导到通常放置地理设置的设置窗口。不知道怎么做?自定义phonegap插件可能是?

您可以在调用中检查参数中的错误代码。我猜测,当gps未启用时,将出现PositionError.PERMISSION\u拒绝,当gps启用时,PositionError.POSITION\u不可用或PositionError.TIMEOUT,但还有其他问题

请注意,这取决于平台。您可能必须编写一条人为错误消息,上面写着“无法获取当前位置。GPS信号较弱或GPS已关闭”

您可以尝试的一件事是调用getCurrentPosition时超时非常小,比如说1毫秒。如果它说权限被拒绝,您可以断定gps已禁用,如果超时,您可以假定gps已启用。我没有时间来测试这个问题,你可以用你的测试结果来编辑这个答案


您可以尝试的另一件事是使用。你必须确保你也在其他平台上使用插件,但它们大部分都在那里。

使用ApacheCordova3Android平台

在Execute方法的GeoBroker.java文件中,在locationManager实例化后添加以下操作

if(action.equals("isGPSEnabled")){
            PluginResult result;
            if ( locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER )){
                result = new PluginResult(PluginResult.Status.OK);
            }else{
                result = new PluginResult(PluginResult.Status.ERROR);
            }
            callbackContext.sendPluginResult(result);
        }
然后在资产的plugins文件夹中的geolocation.js文件中添加暴露新功能

 /**
     * Asynchronously checks if gps is enabled.
     *
     * @param {Function} successCallback    The function to call when gps is enabled.
     * @param {Function} errorCallback      The function to call when gps is not enabled. (OPTIONAL)
     */
    isGPSEnabled:function(successCallback, errorCallback){
        exec(successCallback, errorCallback, "Geolocation", "isGPSEnabled", []);
    }

希望有帮助

我在一些设备上也遇到类似问题。已使用以下代码成功解决此问题:

var options = {maximumAge: 0, timeout: 10000, enableHighAccuracy:true};
navigator.geolocation.getCurrentPosition(onSuccess, onError, options);

仅针对此处重定向的新用户,有一个插件(大约于2014年年中启动),名为:

这个用于iOS、Android和Windows10Mobile的Cordova/Phonegap插件是 用于管理设备设置,如位置、蓝牙和WiFi。 它可以管理运行时权限、设备硬件和 核心操作系统功能


为了最优雅地处理这种情况,您可以使用检查GPS设置是否已启用,(在Android 6+上)检查应用程序是否具有运行时授权,并且(如果未启用),使用通过本机对话框自动打开GPS,而无需用户通过设置页面手动打开。然而,由于后者依赖于设备上的最新Google Play服务库,因此,如果自动切换失败,最好采用手动切换

首先将所需插件添加到项目中:

cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save
然后你会这样做:

function checkAvailability(){
    cordova.plugins.diagnostic.isGpsLocationAvailable(function(available){
        console.log("GPS location is " + (available ? "available" : "not available"));
        if(!available){
           checkAuthorization();
        }else{
            console.log("GPS location is ready to use");
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

function checkAuthorization(){
    cordova.plugins.diagnostic.isLocationAuthorized(function(authorized){
        console.log("Location is " + (authorized ? "authorized" : "unauthorized"));
        if(authorized){
            checkDeviceSetting();
        }else{
            cordova.plugins.diagnostic.requestLocationAuthorization(function(status){
                switch(status){
                    case cordova.plugins.diagnostic.permissionStatus.GRANTED:
                        console.log("Permission granted");
                        checkDeviceSetting();
                        break;
                    case cordova.plugins.diagnostic.permissionStatus.DENIED:
                        console.log("Permission denied");
                        // User denied permission
                        break;
                    case cordova.plugins.diagnostic.permissionStatus.DENIED_ALWAYS:
                        console.log("Permission permanently denied");
                        // User denied permission permanently
                        break;
                }
            }, function(error){
                console.error(error);
            });
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

function checkDeviceSetting(){
    cordova.plugins.diagnostic.isGpsLocationEnabled(function(enabled){
        console.log("GPS location setting is " + (enabled ? "enabled" : "disabled"));
        if(!enabled){
            cordova.plugins.locationAccuracy.request(function (success){
                console.log("Successfully requested high accuracy location mode: "+success.message);
            }, function onRequestFailure(error){
                console.error("Accuracy request failed: error code="+error.code+"; error message="+error.message);
                if(error.code !== cordova.plugins.locationAccuracy.ERROR_USER_DISAGREED){
                    if(confirm("Failed to automatically set Location Mode to 'High Accuracy'. Would you like to switch to the Location Settings page and do this manually?")){
                        cordova.plugins.diagnostic.switchToLocationSettings();
                    }
                }
            }, cordova.plugins.locationAccuracy.REQUEST_PRIORITY_HIGH_ACCURACY);
        }
    }, function(error){
        console.error("The following error occurred: "+error);
    });
}

checkAvailability(); // start the check

我尝试了上面DaveAlden的解决方案,但没有成功,部分原因是他调用的第一个函数
cordova.plugins.diagnostic.isGpsLocationAvailable()
仅适用于Android

正如他所说,首先添加两个插件:

cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save
然后添加以下功能:

// Checks to see if GPS is enabled AND if the app is authorized
checkEnabled(){
    cordova.plugins.diagnostic.isLocationAvailable(
      (available) => { onSuccess(available); },
      (error) => { goToSettings(error); }
    );
}

onSuccess(available) {
  if(available) { // do something };
  else goToSettings(available);
}

// Output error to console
// Prompt user to enable GPS, on OK switch to phone settings
goToSettings(error) {
  console.log("error: ", error);
  if(window.confirm("You need to enable location settings to use the geolocation feature.")) {
    cordova.plugins.diagnostic.switchToSettings();
  }
}

checkEnabled(); // Run check

希望这有助于回答这个问题的其他人

感谢Kinjal,不同的错误代码肯定会解决问题,但这里的问题是,在这两种情况下,我都会得到相同的错误代码-PositionError.TIMEOUT,即GPS未启用和GPS返回时无法确定我的位置。顺便说一句,我正在运行安卓2.3的HTC手机上测试它,我还没有在其他设备上测试过它,这方面我还有很短的路要走。根据设备和操作系统版本的不同,错误回调将不会触发。例如,在我的Galaxy S2上,当GPS被禁用时,我立即得到一个错误。另一方面,到目前为止,我测试过的每个S3和S4都从未触发错误回调(仅在超时后),即使GPS已完全禁用。PhoneGap团队已经意识到了这一点。@Prinzhorn您的评论非常有用。您是否介意详细说明在Galaxy S2上禁用GPS时所收到的错误(即错误消息)。对于S3和S4,似乎很短的超时时间就解决了您的问题,对吗?@StevenWexler抱歉,我已经三个月没有使用PhoneGap了,也不打算在下个月使用它。我找不到此文件。。。或者,如果是,我必须创建此文件—在何处创建?@quicklearner注意,此解决方案适用于apache cordova版本3。也许它在你的版本中被重命名了。无论如何,你应该在使用PluginResult的插件文件夹下找到一个java文件,在www folderwell中找到一个js文件。我感谢你的关注,但我想知道你在谈论哪个插件?没有安装任何设备,但代码中的“cordova”来自何处?似乎它只是在代码中被抛弃了。我应该使用依赖注入吗?@luizfzs你说的注入是什么意思?当你将一些插件添加到Cordova应用程序时,它将作为一个全局变量添加或添加到另一个全局变量下(主要是Cordova本身)。这很奇怪,因为我安装了Cordova diagnostic,但每当我编译时,我都会收到“找不到名称‘Cordova’”。我相信你在其他地方犯了错误。您应该使用chrome inspector再次检查代码chrome://inspect/device#devicesBut 代码上的“cordova”来自哪里?似乎它只是在代码中被抛弃了。我应该使用依赖注入吗?