使用PhoneGap检查GPS是否已启用

Ano*_*eri 20 mobile cordova

我正在使用PhoneGap构建应用程序.虽然使用的PhoneGap的地理位置API,我意识到,这些API超时的原因有两个,并同样的错误被抛出:1.如果用户的设备2.未启用GPS如果GPS已启用,并且不能够得到的位置用户(可能有几个原因,GPS故障,天气不明等)

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

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

Kin*_*xit 37

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

请注意,这取决于平台.你可能不得不写一个人为的错误信息,上面写着"无法获得当前的位置.无论是GPS信号都很弱还是GPS已经关闭".

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

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

  • 这是一个简短的问题.根据设备和操作系统版本,错误回调将不会触发**.例如在我的Galaxy S2上我_immediately_在禁用GPS时出错.另一方面,到目前为止我测试的每个S3和S4都没有发出错误回调(仅在超时后),即使GPS被完全禁用.尽管如此,PhoneGap团队仍然意识到这一点. (5认同)
  • 感谢Kinjal,不同的错误代码肯定会解决问题,但问题是我在两种情况下得到相同的错误代码 - PositionError.TIMEOUT,即当GPS未启用且GPS返回时无法找到我的位置.顺便说一句,我在运行Android 2.3的HTC手机上测试它,我还没有在其他设备上测试它 (4认同)

Dav*_*den 6

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

示例app演示

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

cordova plugin add cordova.plugins.diagnostic --save
cordova plugin cordova-plugin-request-location-accuracy --save
Run Code Online (Sandbox Code Playgroud)

然后你会这样做:

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
Run Code Online (Sandbox Code Playgroud)