最近有个需求需要应用息屏或者在后台时,能够一直获取用户的位置信息,查看了很多资料最后确认需要持续定位逻辑 + 后台长时任务一起设置,才能实现该功能。
但在测试时发现,应用置为后台或者息屏后,长时间不一定位置,系统会将应用给托管掉,不会获取定位信息,一旦手机移动位置,系统会将该应用激活,继续获取定位信息,这种场景节约了手机能耗,下面继续展示代码上的处理
既然是获取用户位置信息,这种隐私性的信息,需求向用户申请权限,ohos.permission.LOCATION和ohos.permission.APPROXIMATELY_LOCATION这两个权限是用户授权的权限,需要我们弹框让用户同意,具体如何申请权限可以参考:https://developer.huawei.com/consumer/cn/blog/topic/03177278991234017
获取权限后,调用function on(type: ‘locationChange’, request: LocationRequest | ContinuousLocationRequest, callback: Callback): void;方法设置持续定位代理,不获取权限时也要调用function off(type: ‘locationChange’, callback?: Callback): void;注销监听
下面是具体代码实现
import { geoLocationManager } from '@kit.LocationKit';
/**
* 持续定位。多用于导航、运动轨迹、出行等场景。
*
* 首先要实例化ContinuousLocationRequest对象,用于告知系统该向应用提供何种类型的位置服务,以及位置结果上报的频率。
* 设置locationScenario:
* 建议locationScenario参数优先根据应用的使用场景进行设置,该参数枚举值定义参见UserActivityScenario,
* 例如地图在导航时使用NAVIGATION参数,可以持续在室内和室外场景获取位置用于导航。
*
* 设置interval:
* 表示上报位置信息的时间间隔,单位是秒,默认值为1秒。如果对位置上报时间间隔无特殊要求,可以不填写该字段。
*/
export function OnContinuousLocationRequest() {
let request: geoLocationManager.ContinuousLocationRequest = {
'interval': 10,
'locationScenario': geoLocationManager.UserActivityScenario.NAVIGATION
}
try {
geoLocationManager.on('locationChange', request, locationCallback);
} catch (err) {
console.info(TAG, "errCode:" + JSON.stringify(err));
}
}
let locationCallback = (location: geoLocationManager.Location): void => {
console.info(TAG, 'locationCallback: data: ' + JSON.stringify(location));
};
/**
* 关闭位置变化订阅,并删除对应的定位请求
*/
export function OffContinuousLocationRequest() {
try {
geoLocationManager.off('locationChange', locationCallback);
} catch (err) {
console.info(TAG, "errCode:" + JSON.stringify(err));
}
}
----------------- end ---------------
后面会继续补充不足之处。