鸿蒙开发——定位功能(获取位置,跳转设置)

 介绍:

实现获取当前位置名称,当用户打开页面时,系统请求用户获取位置权限,如果同意自动更新地点名称,如果禁止,当用户点击获取位置时,出现弹窗,点击确定后实现跳转设置页面,打开位置权限。

代码:

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值