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时是字符串类型,文档并未明确说明,如果需要用到错误码,建议统一进行一次类型转换