HarmonyOS 鸿蒙Next 同时开启模糊定位和精确定位

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next 同时开启模糊定位和精确定位

定位服务不能直接申请ohos.permission.LOCATION,要先申请ohos.permission.APPROXIMATELY_LOCATION,怎么用一个权限申请同时开启两个定位服务?现在是先申请模糊定位然后再弹窗询问是否开启精确定位,跳转设置页手动开启。   
 

2 回复

关于位置服务的三个权限,LOCATION、APPROXIMATELY_LOCATION、LOCATION_IN_BACKGROUND:

1、常规位置服务, LOCATION 和 APPROXIMATELY_LOCATION 这两个权限是都需要申请的,并且LOCATION需要与APPROXIMATELY_LOCATION一起申请才可以 ,需要在module.json5文件中申请这两个权限;申请之后需要校验是否这两个权限,如果没有,需要调用requestPermissionsFromUser向用户申请,具体调用方法可参考下方demo;这两个权限目前没有说明需要跳转设置页面开启;

2、LOCATION_IN_BACKGROUND后台位置服务是必须要引导前往设置页面手动授予;

3、具体可参考API说明:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/permissions-for-all-V5#ohospermissionlocation_in_background

 

import { BusinessError } from '@kit.BasicServicesKit';
import { abilityAccessCtrl, bundleManager, common, PermissionRequestResult, Permissions } from '@kit.AbilityKit';
import { map } from '@kit.MapKit';
import { geoLocationManager } from '@kit.LocationKit';

export class MapPermissionsCheckUtil{
  private mapController?: map.MapComponentController;

  private static mapPermissionsCheckUtil: MapPermissionsCheckUtil;

  static instance() {
    if (!MapPermissionsCheckUtil.mapPermissionsCheckUtil) {
      MapPermissionsCheckUtil.mapPermissionsCheckUtil = new MapPermissionsCheckUtil();
    }
    return MapPermissionsCheckUtil.mapPermissionsCheckUtil;
  }

  // 校验应用是否被授予定位权限,可以通过调用checkAccessToken()方法来校验当前是否已经授权。
  async  checkPermissions(): Promise<boolean> {
    const permissions: Array<Permissions> = ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'];
    for (let permission of permissions) {
      let grantStatus: abilityAccessCtrl.GrantStatus = await this.checkAccessToken(permission);
      if (grantStatus === abilityAccessCtrl.GrantStatus.PERMISSION_GRANTED) {
        // 启用我的位置图层,mapController为地图操作类对象,获取方式详见地图呈现章节
        this.mapController?.setMyLocationEnabled(true);
        // 启用我的位置按钮
        this.mapController?.setMyLocationControlsEnabled(true);
        return true;
      }
    }
    return false;
  }

  requestPermissions(): void {
  //如果没有被授予定位权限,动态向用户申请授权
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    atManager.requestPermissionsFromUser(getContext() as common.UIAbilityContext, ['ohos.permission.LOCATION', 'ohos.permission.APPROXIMATELY_LOCATION'])
      .then((data: PermissionRequestResult) => {
        // 启用我的位置图层
        this.mapController?.setMyLocationEnabled(true);
        // 启用我的位置按钮
        this.mapController?.setMyLocationControlsEnabled(true);
      })
      .catch((err: BusinessError) => {
        console.error(`Failed to request permissions from user. Code is ${err.code}, message is ${err.message}`);
      })
  }

  async checkAccessToken(permission: Permissions): Promise<abilityAccessCtrl.GrantStatus> {
    let atManager: abilityAccessCtrl.AtManager = abilityAccessCtrl.createAtManager();
    let grantStatus: abilityAccessCtrl.GrantStatus = abilityAccessCtrl.GrantStatus.PERMISSION_DENIED;

    let tokenId: number = 0;
    try {
    // 获取应用程序的accessTokenID
      let bundleInfo: bundleManager.BundleInfo = await bundleManager.getBundleInfoForSelf(bundleManager.BundleFlag.GET_BUNDLE_INFO_WITH_APPLICATION);
      let appInfo: bundleManager.ApplicationInfo = bundleInfo.appInfo;
      tokenId = appInfo.accessTokenId;
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Failed to get bundle info for self. Code is ${err.code}, message is ${err.message}`);
    }
    // 校验应用是否被授予权限
    try {
      grantStatus = await atManager.checkAccessToken(tokenId, permission);
    } catch (error) {
      let err: BusinessError = error as BusinessError;
      console.error(`Failed to check access token. Code is ${err.code}, message is ${err.message}`);
    }

    return grantStatus;
  }

  getLocation2CN(latitude:number,longitude:number):string{
    //根据地理编码创建 geoLocationManager.ReverseGeoCodeRequest 对象,并且调用geoLocationManager.isGeocoderAvailable()判断(逆)地理编码服务状态。
    let reverseGeocodeRequest:geoLocationManager.ReverseGeoCodeRequest = {"latitude": latitude, "longitude": longitude, "maxItems": 1};
    let isAvailable = geoLocationManager.isGeocoderAvailable();
    let locationStr = "";
    if(isAvailable){
      try {
        geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err, data) => {
          if (err) {
            console.log('getAddressesFromLocation err: ' + JSON.stringify(err));
          } else {
            let temp = data[0];
            // 详细地址
            locationStr = ""+temp.countryName + temp.placeName;
            console.log('getAddressesFromLocation data: ' + JSON.stringify(data) + "locationStr:"+locationStr);
          }
        });
      } catch (err) {
        console.error("errCode:" + (err as BusinessError).code + ",errMessage:" + (err as BusinessError).message);
      }
    }
    return locationStr;
  }

}

更多关于HarmonyOS 鸿蒙Next 同时开启模糊定位和精确定位的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS(鸿蒙)系统中,同时开启模糊定位和精确定位的功能,可以通过以下方式实现:

HarmonyOS提供了丰富的位置服务API,允许应用根据需要请求不同精度的定位信息。模糊定位通常基于网络基站、Wi-Fi热点等大致确定用户位置,而精确定位则依赖于GPS、北斗等卫星导航系统。

要同时开启这两种定位,开发者需要在应用代码中做以下处理:

  1. 请求权限:首先,确保在应用的manifest文件中声明了必要的定位权限,包括模糊定位和精确定位的权限。

  2. 初始化定位服务:在代码中初始化鸿蒙的定位服务,并设置定位参数,包括定位模式(模糊或精确)。

  3. 同时请求:通过调用定位服务的API,可以分别或同时请求模糊和精确的定位数据。在某些情况下,系统可能默认提供精确位置信息,但开发者可以通过参数设置来控制是否需要同时获取模糊位置作为备选。

  4. 处理定位结果:在回调函数中处理定位结果,区分模糊定位和精确定位的数据,并根据应用需求进行相应处理。

请注意,同时开启两种定位可能会增加设备的功耗,因此在实际应用中需要权衡定位精度和功耗需求。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部