HarmonyOS在SDK9版本下FA模型geolocation无法定位问题解决

问题描述

已经在config.json中加入了ohos.permission.LOCATION权限声明,但是在实际开发中,我使用

geolocation.getCurrentLocation().then((result) => {
  this.locationInfo = JSON.stringify(result);
  this.blog.setTitle(this.locationInfo);
});

获取位置信息得不到结果

我使用的是API9FA模型,且手头现没有可供实机调试的API9设备,远程仿真设备调试多次崩溃,所以我先将此错误情况梳理如下

我们使用了如下图所示的两种方式(注释部分和未注释部分,参考来源)均未能得到弹窗,经过实测在DevEco 3.1.0.500 Beta2版本中上述功能无法正常使用,且调试窗口在requestPermissionsFromUser()方法(经过调试运行已确认是执行到此函数时报错)执行时返回401错误

解决过程

与华为客户服务工程师沟通后,梳理上述思路进行定位处理问题有三:

  • 上述方法一中参考文档来源于openHarmonyOS,与现行HarmonyOS不属于同一部门维护,不保证可用性,例如上述方法在HarmonyOS内就无法正常使用
  • HarmonyOS的SDK经过多次更新迭代,目前原先旧SDK已经全部弃用(401报错原因)
  • 上述问题仅属于接口变更问题

解决方法

在SDK9版本中引入了geoLocationManager()新调用方式,在config.json文件中声明ohos.permission.APPROXIMATELY_LOCATIONohos.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("locationerror=" + JSON.stringify(error));
        });
    }catch (err){
      console.error("locationerrorCode:" + err.code + ",errMessage:" + err.message);
    }

变更为上述函数与接口后顺利弹窗并获取到位置信息

总结

  1. HarmonyOS接口变更还较为频繁,文档内部将各个SDK版本接口均罗列了出来,还需进一步完善分类
  2. ArkTS异步执行,获取权限时需要处理好权限授权以及获取定位的先后同步顺序关系
  3. 通过侧载JS的方式也可以利用第三方API获取大致的经纬度信息,留给各位自行探究