介绍:
实现获取当前位置名称,当用户打开页面时,系统请求用户获取位置权限,如果同意自动更新地点名称,如果禁止,当用户点击获取位置时,出现弹窗,点击确定后实现跳转设置页面,打开位置权限。
代码:
src/main/module.json5
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone",
"tablet",
"2in1"
],
"requestPermissions": [
{
"name": "ohos.permission.LOCATION", // 权限名称,为系统已定义的权限
"reason": "$string:reason", // 申请权限的原因,当申请权限为user_grant权限时该字段为必填
"usedScene": { // 用于描述权限使用场景,当申请权限为user_grant权限时该字段为必填
"abilities": [
"EntryAbility"
],
"when": "always" // 调用时机(inuse:使用时;always:始终)
}
},
{
"name": "ohos.permission.APPROXIMATELY_LOCATION",
"reason": "$string:reason",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
}
],
"deliveryWithInstall": true,
"installationFree": false,
"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ets",
"description": "$string:EntryAbility_desc",
"icon": "$media:layered_image",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:startIcon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
]
}
],
"extensionAbilities": [
{
"name": "EntryBackupAbility",
"srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
"type": "backup",
"exported": false,
"metadata": [
{
"name": "ohos.extension.backup",
"resource": "$profile:backup_config"
}
],
}
]
}
}
index.ets
import { permissionManager } from '../utils/PersionMange';
import { geoLocationManager } from '@kit.LocationKit';
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';
import { locationManager } from '../utils/GetLocation';
@Entry
@Component
struct GetLocation {
@State placeName:string = ''
@State location: string = '';
onPageShow(){
this.getLocation()
}
// 用户是否开启定位权限
reqPermissionsFromUser(permissions: Array<Permissions>) {
let context = getContext(this) as common.UIAbilityContext; //获取去上下文实例
let atManager = abilityAccessCtrl.createAtManager();
return atManager.requestPermissionsFromUser(context, permissions).then((res) => {
let grantStatus: Array<number> = res.authResults;
let length: number = grantStatus.length;
let str: boolean = true
for (let index = 0; index < length; index++) {
if (grantStatus[index] === 0) {
str = true
} else {
str = false
}
}
return str
}).catch((err: string) => {
})
}
async getLocation() {
//询问用户是否开启权限
let status = await this.reqPermissionsFromUser(['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION']);
if (status) {
try {
let location = await geoLocationManager.getCurrentLocation()
geoLocationManager.getAddressesFromLocation(location, async (err, data) => { //用户的当前信息转换为文字描述
if (data) {
let result:ESObject = JSON.parse(JSON.stringify(data[0]))
this.placeName = result.placeName
}
})
} catch (err) {
console.error("aa", '3331' + JSON.stringify(err));
}
}
}
build() {
Column(){
Row(){
Text(!this.placeName?'点击定位城市':this.placeName).fontColor('#3562c9').margin({right:5}).width('70%')
Text(!this.placeName?'请打开位置权限':'当前城市')
}.width('100%').backgroundColor('#ecf2fe').padding(12)
.onClick(async()=>{
locationManager.requestPermissions()
})
}.width('100%').height('100%')
}
}
src/main/ets/utils/GetLocation.ets
import { Permissions } from '@kit.AbilityKit';
import { geoLocationManager } from '@kit.LocationKit';
import { promptAction } from '@kit.ArkUI';
import { permissionManager } from './PersionMange';
class LocationManager {
private permissions: Permissions[] = [
'ohos.permission.APPROXIMATELY_LOCATION',
'ohos.permission.LOCATION',
]
// 申请权限
async requestPermissions() {
try {
// 申请权限
await permissionManager.requestPermissions(this.permissions)
} catch {
promptAction.showDialog({
alignment: DialogAlignment.Center,
title: '温馨提示',
message: '定位功能需要获取权限,请在系统设置中设置允许位置权限与精确位置',
buttons: [
{ text: '取消', color: '#666' },
{ text: '立即开启', color: '#2865e6' }
]
})
.then((res) => {
// 打开设置页
if (res.index === 1) {
permissionManager.openPermissionSettingsPage()
}
})
}
}
// 获取当前位置
async getCurrentAddress() {
// 获取经纬度
const location = await geoLocationManager.getCurrentLocation()
// 根据经纬度,调用逆地理编码服务,将坐标转换为地理描述
// Windows 模拟器目前不支持调用 逆地理编码服务
const geoAddress = await geoLocationManager.getAddressesFromLocation({
locale: 'zh', //
latitude: location.latitude,
longitude: location.longitude,
maxItems: 1
})
return geoAddress
}
}
export const locationManager = new LocationManager()
src/main/ets/utils/PersionMange.ets
import { abilityAccessCtrl, bundleManager, common, Permissions } from '@kit.AbilityKit';
class PermissionManager {
// 打开系统设置的权限管理页(处理授权结果)
openPermissionSettingsPage() {
// 获取上下文
const context = getContext() as common.UIAbilityContext
// 获取包信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 打开系统设置页
context.startAbility({
bundleName: 'com.huawei.hmos.settings',
abilityName: 'com.huawei.hmos.settings.MainAbility',
uri: 'application_info_entry',
parameters: {
// 按照包名打开对应设置页
pushParams: bundleInfo.name
}
})
}
// 检查是否授权
checkPermissions(permissions: Permissions[]) {
// 程序访问控制管理
const atManager = abilityAccessCtrl.createAtManager();
// 获取 bundle 信息
const bundleInfo = bundleManager.getBundleInfoForSelfSync(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION)
// 提取 tokenID 标识
const tokenID = bundleInfo.appInfo.accessTokenId
// 校验应用是否被授予权限
const authResults = permissions.map((item) => atManager.checkAccessTokenSync(tokenID, item))
// 返回是否已授权结果
return authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
}
// 动态申请授权(首次弹窗申请)
async requestPermissions(permissions: Permissions[]) {
// 程序访问控制管理
const atManager = abilityAccessCtrl.createAtManager();
// 拉起弹框请求用户授权
const grantStatus = await atManager.requestPermissionsFromUser(getContext(), permissions)
// 获取请求权限的结果
const isAuth = grantStatus.authResults.every(v => v === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED)
// 返回 Promise 授权结果
return isAuth ? Promise.resolve(true) : Promise.reject(false)
}
}
// 导出类的实例
export const permissionManager = new PermissionManager()