解决方案 1
/*
*若通过用户操作获取定位无需实时上传定位 可用一下代码 相对定位更加准确
*若需求是生成轨迹 如:滴滴打车 顺风车 运动轨迹 以下代码不可行
*在息屏 或 代码再后台运行时 改代码 无法获取定位信息
*/
navigator.geolocation.getCurrentPosition(onSuccess , onError,{
enableHighAcuracy : true,// 指示浏览器获取高精度的位置,默认为false
timeout : 5000,// 指定获取地理位置的超时时间,默认不限时,单位为毫秒
maximumAge : 2000 // 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。
});
//定位数据获取成功响应
function onSuccess(position){ })
//定位数据获取失败响应
function onError(error) {
if(window.mySET1)clearTimeout(window.mySET1)
window.mySET1=setTimeout(() => {
switch(error.code) {
case error.PERMISSION_DENIED:
console.log("定位失败,用户拒绝请求地理定位");
Toast("您拒绝对获取地理位置的请求");
break;
case error.POSITION_UNAVAILABLE:
Toast("定位失败,位置信息是不可用");
console.log("定位失败,位置信息是不可用");
break;
case error.TIMEOUT:
console.log("定位失败,请求获取用户位置超时");
Toast("请求您的地理位置超时");
break;
case error.UNKNOWN_ERROR:
Toast("定位失败,定位系统失效");
console.log("定位失败,定位系统失效");
break;
}
}, 500);
}
解决方案 2
/*
*该方法可在后台运行 或 息屏 后 继续获取定位
*定位位置相对不是那么准确 存在些许误差 但是够用
* 参考文档:http://www.html5plus.org/doc/zh_cn/geolocation.html
*/
// 扩展API加载完毕后调用onPlusReady回调函数
document.addEventListener('plusready', onPlusReady, false);
// 扩展API加载完毕,现在可以正常调用扩展API
function onPlusReady(){
// 使用百度地图地位模块获取位置信息
plus.geolocation.getCurrentPosition(function(p){
alert('Geolocation\nLatitude:' + p.coords.latitude + '\nLongitude:' + p.coords.longitude + '\nAltitude:' + p.coords.altitude);
}, function(e){
alert('Geolocation error: ' + e.message);
},{provider:'baidu'});
}
------------------------2020-9-3-------------------------------
对解决方案进行优化
若以上代码依旧未解决持续定位问题
/*
*允许程序后台运行,以持续获取GPS位置
*结束程序后台运行
* 此处代码摘自:https://ask.dcloud.net.cn/article/1273
* 若代码添加后还是不理想 在手机设置中设置允许后台运行 找到电池相关设置 以华为为例
* 设置-》电池-》耗电排行-》你的APP-》应用启动管理-》允许后台活动
*/
var g_wakelock = null;
//允许程序后台运行,以持续获取GPS位置
function wakeLock() {
//Android
var main = plus.android.runtimeMainActivity();
var Context = plus.android.importClass("android.content.Context");
var PowerManager = plus.android.importClass("android.os.PowerManager");
var pm = main.getSystemService(Context.POWER_SERVICE);
g_wakelock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ANY_NAME");
g_wakelock.acquire();
}
wakeLock()
//结束程序后台运行
function releaseWakeLock () {
if(g_wakelock != null && g_wakelock.isHeld()) {
g_wakelock.release();
g_wakelock = null;
}
}