使用PhoneGap检查GPS是否已启用

时间:2012-10-22 07:06:35

标签: cordova mobile

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

我在区分原因方面遇到了问题?有关如何做的任何想法?

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

6 个答案:

答案 0 :(得分:37)

您可以在PositionError的来电中查看geolocationError getCurrentPosition参数中的错误代码。我猜测,当gps未启用时,它将是PositionError.PERMISSION_DENIED;当启用gps时,它会是PositionError.POSITION_UNAVAILABLE或PositionError.TIMEOUT,但还有其他问题。

请注意,这取决于平台。您可能不得不写一条设计错误消息,上面写着“无法获取当前位置.GPS信号很弱或GPS已关闭”。

你可以尝试的一件事是用一个非常小的超时调用getCurrentPosition,比如1 ms。如果它说权限被拒绝,您可以断定gps已被禁用,如果超时,您可以假设已启用gps。我没有时间对此进行测试,您可以根据测试结果编辑此答案。

您可以尝试的另一件事是使用diagnostic phonegap plugin for android。你必须确保你也使用其他平台的插件,但它们也都在那里。

答案 1 :(得分:6)

为了最优雅地处理这种情况,您可以使用cordova.plugins.diagnostic检查是否启用了GPS设置,并且(在Android 6+上)检查应用是否具有运行时授权,以及(如果未启用),请使用cordova-plugin-request-location-accuracy通过原生对话框自动开启GPS,无需用户通过设置页面手动开启。但是,由于后者依赖于设备上的最新Google Play服务库,因此如果自动切换失败,最好还是回退到手动切换。

Example app demo

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

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

答案 2 :(得分:3)

我的某些设备存在类似问题。管理以使用以下代码解决它:

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

答案 3 :(得分:1)

我尝试过上面的DaveAlden解决方案,但它没有用,部分原因是因为他调用cordova.plugins.diagnostic.isGpsLocationAvailable()的第一个函数是plugin docs的仅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

希望这可以帮助那些得出这个答案的人。

答案 4 :(得分:0)

使用apache cordova 3 android平台

在exectute方法的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", []);
    }

希望有所帮助

答案 5 :(得分:0)

对于重定向到这里的新用户,有一个插件(大约在2014年中开始),称为Cordova diagnostic plugin

  

适用于iOS,Android和Windows 10 Mobile的Cordova / Phonegap插件   用于管理设备设置,如位置,蓝牙和WiFi。   它可以管理运行时权限,设备硬件和   核心OS功能。 ref