方位服务开发概述
移动终端设备现已深化人们日常日子的方方面面,如查看所在城市的气候、新闻轶事、出行打车、游览导航、运动记载。这些习以为常的活动,都离不开定位用户终端设备的方位。
当用户处于这些丰厚的运用场景中时,体系的方位才能能够供给实时精确的方位数据。关于开发者,设计依据方位体会的服务,也能够使运用的运用体会更靠近每个用户。
当运用在完结依据设备方位的功用时,如:驾车导航,记载运动轨道等,能够调用该模块的 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方位权限恳求办法介绍
假如运用在后台运行时也需求拜访设备方位,除需求将运用声明为答应后台运行外,还有必要恳求 ohos.permission.LOCATION_IN_BACKGROUND 权限,这样运用在切入后台之后,体系能够持续上报方位信息。
开发者能够在运用配置文件中声明所需求的权限,详细可参阅授权恳求辅导。
方位服务每个接口需求恳求哪些权限能够拜见如下文档:方位服务。
开发过程
详细可参阅授权恳求辅导。
获取设备的方位信息开发辅导
场景概述
开发者能够调用 HarmonyOS 方位相关接口,获取设备实时方位,或许最近的前史方位。
关于方位灵敏的运用事务,主张获取设备实时方位信息。假如不需求设备实时方位信息,而且希望尽或许的节约耗电,开发者能够考虑获取最近的前史方位。
接口阐明
获取设备的方位信息所运用的接口如下,详细阐明拜见:方位服务。
表 2获取设备的方位信息接口介绍
开发过程
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(逆)地舆编码转化接口介绍
开发过程
阐明
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地舆围栏接口介绍
开发过程
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 的动作。