方位服务开发概述

移动终端设备现已深化人们日常日子的方方面面,如查看所在城市的气候、新闻轶事、出行打车、游览导航、运动记载。这些习以为常的活动,都离不开定位用户终端设备的方位。

当用户处于这些丰厚的运用场景中时,体系的方位才能能够供给实时精确的方位数据。关于开发者,设计依据方位体会的服务,也能够使运用的运用体会更靠近每个用户。

当运用在完结依据设备方位的功用时,如:驾车导航,记载运动轨道等,能够调用该模块的 API 接口,完结方位信息的获取。

方位服务简介

方位子体系运用多种定位技能供给服务,如 GNSS 定位、基站定位、WLAN/蓝牙定位(基站定位、WLAN/蓝牙定位后续统称“网络定位技能”);经过这些定位技能,不管用户设备在室内或是野外,都能够精确地确定设备方位。

方位服务除了供给根底的定位服务之外,还供给了地舆围栏、地舆编码、逆地舆编码、国家码等功用和接口。

坐标

体系以 1984 年国际大地坐标体系为参阅,运用经度、纬度数据描绘地球上的一个方位。

GNSS 定位

依据全球导航卫星体系,包括:GPS、GLONASS、斗极、Galileo 等,经过导航卫星、设备芯片供给的定位算法,来确定设备精确方位。定位过程详细运用哪些定位体系,取决于用户设备的硬件才能。

基站定位

依据设备当时驻网基站和相邻基站的方位,预算设备当时方位。此定位办法的定位成果精度相对较低,而且需求设备能够拜访蜂窝网络。

WLAN、蓝牙定位

依据设备可搜索到的周围 WLAN、蓝牙设备方位,预算设备当时方位。此定位办法的定位成果精度依靠设备周围可见的固定 WLAN、蓝牙设备的散布,密度较高时,精度也相较于基站定位办法更高,一起也需求设备能够拜访网络。

运作机制

方位才能作为体系为运用供给的一种根底服务,需求运用在所运用的事务场景,向体系自动主张恳求,并在事务场景完毕时,自动完毕此恳求,在此过程中体系会将实时的定位成果上报给运用。

束缚与限制

运用设备的方位才能,需求用户进行承认并自动敞开方位开关。假如方位开关没有敞开,体系不会向任何运用供给方位服务。

设备方位信息归于用户灵敏数据,所以即运用户现已敞开方位开关,运用在获取设备方位前仍需向用户恳求方位拜访权限。在用户承认答应后,体系才会向运用供给方位服务。

恳求方位权限开发辅导

场景概述

运用在运用方位服务体系才能前,需求检查是否现已获取用户授权拜访设备方位信息。如未取得授权,能够向用户恳求需求的方位权限。

体系供给的定位权限有:

●ohos.permission.LOCATION:用于获取精准方位,精准度在米级别。

●ohos.permission.APPROXIMATELY_LOCATION:用于获取模糊方位,精确度为 5 公里。

●ohos.permission.LOCATION_IN_BACKGROUND:用于运用切换到后台仍然需求获取定位信息的场景。

拜访设备的方位信息,有必要恳求权限,而且取得用户授权。

表 1方位权限恳求办法介绍

HarmonyOS 方位服务开发攻略

假如运用在后台运行时也需求拜访设备方位,除需求将运用声明为答应后台运行外,还有必要恳求 ohos.permission.LOCATION_IN_BACKGROUND 权限,这样运用在切入后台之后,体系能够持续上报方位信息。

开发者能够在运用配置文件中声明所需求的权限,详细可参阅授权恳求辅导

方位服务每个接口需求恳求哪些权限能够拜见如下文档:方位服务

开发过程

详细可参阅授权恳求辅导

获取设备的方位信息开发辅导

场景概述

开发者能够调用 HarmonyOS 方位相关接口,获取设备实时方位,或许最近的前史方位。

关于方位灵敏的运用事务,主张获取设备实时方位信息。假如不需求设备实时方位信息,而且希望尽或许的节约耗电,开发者能够考虑获取最近的前史方位。

接口阐明

获取设备的方位信息所运用的接口如下,详细阐明拜见:方位服务

表 2获取设备的方位信息接口介绍

HarmonyOS 方位服务开发攻略

开发过程

1. 获取设备的方位信息,需求有方位权限,方位权限恳求的办法和过程见恳求方位权限开发辅导

2. 导入 geoLocationManager 模块,所有与根底定位才能相关的功用 API,都是经过该模块供给的。

importgeoLocationManagerfrom'@ohos.geoLocationManager';

3. 实例化 LocationRequest 目标,用于奉告体系该向运用供给何种类型的方位服务,以及方位成果上报的频率。

办法一:

为了面向开发者供给靠近其运用场景的 API 运用办法,体系界说了几种常见的方位才能运用场景,并针对运用场景做了恰当的优化处理,运用能够直接匹配运用,简化开发复杂度。体系当时支撑场景如下表所示。

定位场景类型阐明

a. 导航场景:NAVIGATION

适用于在野外定位设备实时方位的场景,如车载、步行导航。

在此场景下,为保证体系供给方位成果精度最优,主要运用 GNSS 定位技能供给定位服务,结合场景特色,在导航发动之初,用户很或许在室内、车库等遮盖环境,GNSS 技能很难供给方位服务。

为解决此问题,我们会在 GNSS 供给安稳方位成果之前,运用体系网络定位技能,向运用供给方位服务,以在导航初始阶段提高用户体会。

此场景默许以最小 1 秒距离上报定位成果,运用此场景的运用有必要恳求 ohos.permission.LOCATION 权限,一起取得用户授权。

b. 轨道跟踪场景:TRAJECTORY_TRACKING

适用于记载用户方位轨道的场景,如运动类运用记载轨道功用。主要运用 GNSS 定位技能供给定位服务。

此场景默许以最小 1 秒距离上报定位成果,而且运用有必要恳求 ohos.permission.LOCATION 权限,一起取得用户授权。

c. 出行约车场景:CAR_HAILING

适用于用户出行打车时定位当时方位的场景,如网约车类运用。

此场景默许以最小 1 秒距离上报定位成果,而且运用有必要恳求 ohos.permission.LOCATION 权限,一起取得用户授权。

d. 日子服务场景:DAILY_LIFE_SERVICE

日子服务场景,适用于不需求定位用户精确方位的运用场景,如新闻资讯、网购、点餐类运用,做推荐、推送时定位用户大致方位即可。

此场景默许以最小 1 秒距离上报定位成果,而且运用至少恳求 ohos.permission.LOCATION 权限,一起取得用户授权。

e. 无功耗场景:NO_POWER

无功耗场景,适用于不需求自动发动定位事务。体系在响应其他运用发动定位事务并上报方位成果时,会一起向恳求此场景的运用程序上报定位成果,当时的运用程序不发生定位功耗。

此场景默许以最小 1 秒距离上报定位成果,而且运用需求恳求 ohos.permission.LOCATION 权限,一起取得用户授权。

exportenumLocationRequestScenario{
         UNSET = 0x300,
         NAVIGATION,
         TRAJECTORY_TRACKING,
         CAR_HAILING,
         DAILY_LIFE_SERVICE,
         NO_POWER,
     }

以导航场景为例,实例化办法如下:

letrequestInfo= {'scenario':geoLocationManager.LocationRequestScenario.NAVIGATION, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0};

办法二:

假如界说的现有场景类型不能满意所需的开发场景,体系供给了基本的定位优先级战略类型。

定位优先级战略类型阐明

●定位精度优先战略:ACCURACY

定位精度优先战略主要以 GNSS 定位技能为主,在开阔场景下能够供给米级的定位精度,详细性能指标依靠用户设备的定位硬件才能,但在室内等强遮盖定位场景下,无法供给精确的方位服务。

●快速定位优先战略:FIRST_FIX

快速定位优先战略会一起运用 GNSS 定位、基站定位和 WLAN、蓝牙定位技能,以便室内和野外场景下,经过此战略都能够取得方位成果,当各种定位技能都有供给方位成果时,体系会挑选其间精度较好的成果回来给运用。因为对各种定位技能一起运用,对设备的硬件资源耗费较大,功耗也较大。

●低功耗定位优先战略:LOW_POWER

低功耗定位优先战略主要运用基站定位和 WLAN、蓝牙定位技能,也能够一起供给室内和野外场景下的方位服务,因为其依靠周边基站、可见 WLAN、蓝牙设备的散布状况,定位成果的精度波动规模较大,假如对定位成果精度要求不高,或许运用场景多在有基站、可见 WLAN、蓝牙设备高密度散布的状况下,推荐运用,能够有效节约设备功耗。

exportenumLocationRequestPriority{
         UNSET = 0x200,
         ACCURACY,
         LOW_POWER,
         FIRST_FIX,
     }

以定位精度优先战略为例,实例化办法如下:

letrequestInfo= {'priority':geoLocationManager.LocationRequestPriority.ACCURACY, 'timeInterval': 0, 'distanceInterval': 0, 'maxAccuracy': 0};

4. 实例化 Callback 目标,用于向体系供给方位上报的途径。

运用需求自行完结体系界说好的回调接口,并将其实例化。体系在定位成功确定设备的实时方位成果时,会经过该接口上报给运用。运用程序能够在接口的完结中完结自己的事务逻辑。

let locationChange = (location) => {
console.log('locationChanger:data:'   JSON.stringify(location));
};

5. 发动定位。

geoLocationManager.on('locationChange',requestInfo,locationChange);

6. (可选)完毕定位。

假如不自动完毕定位或许导致设备功耗高,耗电快;主张在不需求获取定位信息时及时完毕定位。

geoLocationManager.off('locationChange',locationChange);

假如运用运用场景不需求实时的设备方位,能够获取体系缓存的最近一次前史定位成果。

importgeoLocationManagerfrom'@ohos.geoLocationManager';
try {
    letlocation=geoLocationManager.getLastLocation();
} catch (err) {
console.error("errCode:"  err.code  ",errMessage:"  err.message);
}

(逆)地舆编码转化开发辅导

场景概述

运用坐标描绘一个方位,非常精确,可是并不直观,面向用户表达并不友爱。体系向开发者供给了以下两种转化才能。

●地舆编码转化:将地舆描绘转化为详细坐标。

●逆地舆编码转化才能:将坐标转化为地舆描绘。

其间地舆编码包括多个属性来描绘方位,包括国家、行政区划、大街、门牌号、地址描绘等等,这样的信息更便于用户了解。

接口阐明

进行坐标和地舆编码信息的彼此转化,所运用的接口阐明如下,详细信息拜见:方位服务

表 3(逆)地舆编码转化接口介绍

HarmonyOS 方位服务开发攻略

HarmonyOS 方位服务开发攻略

开发过程

阐明

GeoConvert 需求拜访后端服务,请保证设备联网,以进行信息获取。

1. 导入 geoLocationManager 模块,所有与(逆)地舆编码转化才能相关的功用 API,都是经过该模块供给的。

importgeoLocationManagerfrom'@ohos.geoLocationManager';

2. 查询 geoCoder 服务是否可用。

●调用 isGeoServiceAvailable 查询 geoCoder 服务是否可用,假如服务可用再持续进行过程

importgeoLocationManagerfrom'@ohos.geoLocationManager';
try {
    letisAvailable=geoLocationManager.isGeocoderAvailable();
} catch (err) {
console.error("errCode:"  err.code  ",errMessage:"  err.message);
}

3. 获取转化成果。

●调用 getAddressesFromLocation,坐标转化地舆方位信息。

letreverseGeocodeRequest= {"latitude": 31.12, "longitude": 121.11, "maxItems": 1};
try {
geoLocationManager.getAddressesFromLocation(reverseGeocodeRequest, (err,data) => {
        if (err) {
console.log('getAddressesFromLocationerr:'   JSON.stringify(err));
        } else {
console.log('getAddressesFromLocationdata:'   JSON.stringify(data));
        }
    });
} catch (err) {
console.error("errCode:"  err.code  ",errMessage:"  err.message);
}

参阅接口 API 阐明方位服务,运用能够取得与此坐标匹配的 GeoAddress 列表,运用能够依据实际运用需求,读取相应的参数数据。

●调用 getAddressesFromLocationName 方位描绘转化坐标。

letgeocodeRequest= {"description": "上海市浦东新区xx路xx号", "maxItems": 1};
try {
geoLocationManager.getAddressesFromLocationName(geocodeRequest, (err,data) => {
        if (err) {
console.log('getAddressesFromLocationNameerr:'   JSON.stringify(err));
        } else {
console.log('getAddressesFromLocationNamedata:'   JSON.stringify(data));
        }
    });
} catch (err) {
console.error("errCode:"  err.code  ",errMessage:"  err.message);
}

参阅接口 API 阐明方位服务,运用能够取得与方位描绘相匹配的 GeoAddress 列表,其间包括对应的坐标数据,请参阅 API 运用。

假如需求查询的方位描绘或许呈现多地重名的恳求,能够设置 GeoCodeRequest,经过设置一个经纬度规模,以高效地获取期望的精确成果。

地舆围栏开发辅导

场景概述

地舆围栏就是虚拟地舆边界,当设备进入、离开某个特定地舆区域时,能够接收自动告诉和正告。

现在仅支撑圆形围栏,而且依靠 GNSS 芯片的地舆围栏功用。

运用场景举例:开发者能够运用地舆围栏,在企业周围创立一个区域进行广告定位,在不同的地点,在移动设备上进行有针对性的促销优惠。

接口阐明

地舆围栏所运用的接口如下,详细阐明拜见:方位服务

表 4地舆围栏接口介绍

HarmonyOS 方位服务开发攻略

开发过程

1. 运用地舆围栏功用,需求有权限 ohos.permission.APPROXIMATELY_LOCATION,方位权限恳求的办法和过程见恳求方位权限开发辅导

2. 导入geoLocationManager模块和wantAgent模块。

importgeoLocationManagerfrom'@ohos.geoLocationManager';
importwantAgentfrom'@ohos.app.ability.wantAgent';

3. 创立WantAgentInfo信息。

场景一:创立拉起 Ability 的 WantAgentInfo 信息。

letwantAgentObj= null; //用于保存创立成功的wantAgent目标,后续运用其完结触发的动作。
//经过WantAgentInfo的operationType设置动作类型
letwantAgentInfo= {
    wants: [
        {
            deviceId: '',
            bundleName: 'com.example.myapplication',
            abilityName: 'EntryAbility',
            action: '',
            entities: [],
            uri: '',
            parameters: {}
        }
    ],
    operationType:wantAgent.OperationType.START_ABILITY,
    requestCode: 0,
    wantAgentFlags:[wantAgent.WantAgentFlags.CONSTANT_FLAG]
};

场景二:创立发布公共事情的 WantAgentInfo 信息。

letwantAgentObj= null; //用于保存创立成功的WantAgent目标,后续运用其完结触发的动作。
//经过WantAgentInfo的operationType设置动作类型
letwantAgentInfo= {
    wants: [
        {
            action: 'event_name', //设置事情名
            parameters: {},
        }
    ],
    operationType:wantAgent.OperationType.SEND_COMMON_EVENT,
    requestCode: 0,
    wantAgentFlags: [wantAgent.WantAgentFlags.CONSTANT_FLAG],
}

4. 调用getWantAgent()办法进行创立 WantAgent。

而且在获取到 WantAgent 目标之后调用地舆围栏接口添加围栏。

//创立WantAgent
wantAgent.getWantAgent(wantAgentInfo, (err,data) => {
    if (err) {
console.error('getWantAgenterr='   JSON.stringify(err));
      return;
    }
console.info('getWantAgentsuccess');
wantAgentObj=data;
    letrequestInfo= {'priority': 0x201, 'scenario': 0x301, "geofence": {"latitude": 121, "longitude": 26, "radius": 100, "expiration": 10000}};
    try {
geoLocationManager.on('gnssFenceStatusChange',requestInfo,wantAgentObj);
    } catch (err) {
console.error("errCode:"  err.code  ",errMessage:"  err.message);
    }
});

1. 当设备进入或许退出该围栏时,体系会自动触发 WantAgent 的动作。