基于定位获取详细的地址信息

26 阅读1分钟

1.配置地理位置权限

"requestPermissions": [
  {
    "name": "ohos.permission.APPROXIMATELY_LOCATION",
    "reason": "$string:location"
  },
  {
    "name": "ohos.permission.LOCATION",
    "reason": "$string:location"
  }
],

2.封装申请用户权限


import { abilityAccessCtrl, bundleManager, Permissions } from '@kit.AbilityKit'

class PermissionPlugin {
  // 检查单个权限
  checkAccessToken(permission: Permissions) {
    try {
      const atManager = abilityAccessCtrl.createAtManager();
      const bundleInfo =
        bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
      const accessTokenId = bundleInfo.appInfo.accessTokenId
      const grantStatus = atManager.checkAccessTokenSync(accessTokenId, permission);
      return grantStatus;
    } catch (e) {
      return abilityAccessCtrl.GrantStatus.PERMISSION_DENIED
    }
  }

  // 检查多个权限
  async checkPermissions(permissions: Permissions[]) {
    for (let permission of permissions) {
      const grantStatus = this.checkAccessToken(permission)
      if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_DENIED) {
        return false
      }
    }
    return true
  }

  // 首次向用户申请授权
  async requestPermissions(permissions: Permissions[]) {
    const atManager = abilityAccessCtrl.createAtManager();
    const res = await atManager.requestPermissionsFromUser(getContext(), permissions) // 首次
    const isAuth = res.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    return isAuth ? Promise.resolve() : Promise.reject()
    // return res.authResults.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }

  // 二次向用户申请授权
  async requestPermissionOnSetting(permissions: Permissions[]) {
    const atManager = abilityAccessCtrl.createAtManager();
    const grantStatus = await atManager.requestPermissionOnSetting(getContext(), permissions) // 二次
    const isAuth = grantStatus.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
    return isAuth ? Promise.resolve() : Promise.reject()
    // return grantStatus.every(item => item === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
  }
}


export const permissionPlugin = new PermissionPlugin()

3.获取地理位置并进行解析

async getLocation() {
  try {
    //获取经纬度
    const location = await geoLocationManager.getCurrentLocation()
    //使用逆地理编码解析经纬度
    const myLocation = await geoLocationManager.getAddressesFromLocation(location)
    this.address.address = myLocation.pop()?.placeName || ''
  } catch (err) {
    logger.info(typeof err.code + ':' + err.code)
    if (err.code === '3301100') {
      promptAction.showToast({ message: '请开启定位开关' })
    }
  }

}
try {
  await permissionPlugin.requestPermissions(['ohos.permission.LOCATION',
    'ohos.permission.APPROXIMATELY_LOCATION'])
  //首次授权成功->获取经纬度
  this.getLocation()

} catch (err) {
  //二次弹窗授权
  await permissionPlugin.requestPermissionOnSetting(['ohos.permission.LOCATION',
    'ohos.permission.APPROXIMATELY_LOCATION'])
  //二次授权弹窗成功后->获取经纬度->解析经纬度
  this.getLocation()
}

4.坑点

地址解析错误码为3301100时是字符串类型,文档并未明确说明,如果需要用到错误码,建议统一进行一次类型转换