问题描述
已经在config.json中加入了ohos.permission.LOCATION权限声明,但是在实际开发中,我使用
geolocation.getCurrentLocation().then((result) => {
this.locationInfo = JSON.stringify(result);
this.blog.setTitle(this.locationInfo);
});
获取位置信息得不到结果
我使用的是API9FA模型,且手头现没有可供实机调试的API9设备,远程仿真设备调试多次崩溃,所以我先将此错误情况梳理如下
我们使用了如下图所示的两种方式(注释部分和未注释部分,参考来源来自https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/security/accesstoken-guidelines.md#stage%E6%A8%A1%E5%9E%8B-1)均未能得到弹窗,经过实测在DevEco 3.1.0.500 Beta2版本中上述功能无法正常使用,且调试窗口在requestPermissionsFromUser()方法(经过调试运行已确认是执行到此函数时报错)执行时返回401错误
解决过程
与华为客户服务工程师沟通后,梳理上述思路进行定位处理问题有三:
- 上述方法一中参考文档来源于openHarmonyOS,与现行HarmonyOS不属于同一部门维护,不保证可用性,例如上述方法在HarmonyOS内就无法正常使用
- HarmonyOS的SDK经过多次更新迭代,目前原先旧SDK已经全部弃用(401报错原因)
- 上述问题仅属于接口变更问题
解决方法
在SDK9版本中引入了geoLocationManager()
的新调用方式,在config.json
文件中声明ohos.permission.APPROXIMATELY_LOCATION
和ohos.permission.LOCATION
权限后,使用getCurrentLocation(request?: CurrentLocationRequest): Promise<Location>
方法即可弹窗并获得定位权限,下面给出我的例子,假设config.json
中已经配置好所需权限和说明
获取权限部分
let context = featureAbility.getContext();
let array:Array<string> = ["ohos.permission.APPROXIMATELY_LOCATION","ohos.permission.LOCATION"];
//requestPermissionsFromUser会判断权限的授权状态来决定是否唤起弹窗
context.requestPermissionsFromUser(array, 1).then(function(data) {
console.log("Permission data:" + JSON.stringify(data));
console.log("Permission data permissions:" + JSON.stringify(data.permissions));
console.log("Permission data result:" + JSON.stringify(data.authResults));
}, (err) => {
console.error('Failed to start ability', err.code);
});
获取定位部分
try{
geoLocationManager.getCurrentLocation().then((result) => {
console.log('current location: ' + JSON.stringify(result));
}).catch((error) => {
console.error("locatinotallow=" + JSON.stringify(error));
});
}catch (err){
console.error("locationerrorCode:" + err.code + ",errMessage:" + err.message);
}
变更为上述函数与接口后顺利弹窗并获取到位置信息
总结
- HarmonyOS接口变更还较为频繁,文档内部将各个SDK版本接口均罗列了出来,还需进一步完善分类
- ArkTS异步执行,获取权限时需要处理好权限授权以及获取定位的先后同步顺序关系
- 通过侧载JS的方式也可以利用第三方API获取大致的经纬度信息,留给各位自行探究