更新记录
1.0.3(2024-02-04)
使用complieOnly避免与uni内置定位功能冲突
1.0.2(2024-01-30)
简单自测
1.0.1(2024-01-26)
完善readme.md
查看更多平台兼容性
Vue2 | Vue3 |
---|---|
√ | √ |
App | 快应用 | 微信小程序 | 支付宝小程序 | 百度小程序 | 字节小程序 | QQ小程序 |
---|---|---|---|---|---|---|
Android:4.4,iOS:不支持,HarmonyNext:不确定 | × | × | × | × | × | × |
钉钉小程序 | 快手小程序 | 飞书小程序 | 京东小程序 |
---|---|---|---|
× | × | × | × |
H5-Safari | Android Browser | 微信浏览器(Android) | QQ浏览器(Android) | Chrome | IE | Edge | Firefox | PC-Safari |
---|---|---|---|---|---|---|---|---|
× | × | × | × | × | × | × | × | × |
hr-getLocation-amap
使用高德定位sdk获取当前的地理位置信息,如经纬度,地址,高度和速度等多种信息,具体一定的保活能力,特点:
- 支持单次定位;
- 支持前台连续定位;
- 支持应用进入后台后,通过开启前台服务,忽略电池优化来持续定位获取位置信息,拥有一定的保活能力;
- api和原uni.getLocation等基本保持一致,原使用uni相关API的代码可使用替换方法名的方式快速修改;
使用过程中有什么问题,希望大家及时和我反馈,qq群:485608318。
使用步骤
一、安装本插件;
二、配置您的应用的minSdkVersion
和targetSdkVersion
:
- 在项目的根目录中的
manifest.json
中的App常用其它设置
中配置。 - 如果不配置,minSdkVersion默认值是19(即最低支持Android4.4),targetSdkVersion版本是28(即Android9.0)。
- 本插件目前只支持targetSdk和minSdkVersion>=19。
三、在您的应用根目录的AndroidManifest.xml中配置高德定位的key,如果没有这个文件,请创建。详见应用清单文件 AndroidManifest.xml。
高德地图Key
:需到高德开放平台申请,可参考:获取高德地图key,配置示例<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" package="net.lvip.hr_getlocation_amap_demo"> <application> <meta-data android:name="aMapSDKKey" android:value="1577e12eef1ec266c18e748ef7bfe334"> </meta-data> </application> </manifest>
四、在页面中引入插件,调用导出的方法,并传入相应参数,参数详情见下文代码示例。
五、打包自定义基座
并运行,进行真机调试。
完整使用示例
可以直接引入demo项目,运行并查看相应代码。
<template>
<view class="content">
<image class="logo" src="/static/logo.png"></image>
<view class="text-area">
<button type="primary" size="default" @click="getLocationOnce">前台单次定位</button>
<button type="primary" @click="getLocationForeground">前台持续定位</button>
<button type="primary" @click="getLocationForegroundService">持续定位(使用前台服务)</button>
<button type="primary" @click="stopMapLocationUpdate">停止定位</button>
</view>
</view>
</template>
<script>
import {
getLocation,
startLocationUpdate,
startLocationUpdateBackground,
stopLocationUpdate,
onLocationChange,
onLocationChangeError,
offLocationChange
} from '@/uni_modules/hr-getLocation-amap';
export default {
methods: {
getLocationOnce() {
getLocation({
success: function(result) {
console.log('单次定位结果:', result.longitude, result.latitude);
},
fail: (error) => {
console.log(error);
},
complete: () => {
console.log('complete');
}
});
},
getLocationForeground() {
startLocationUpdate({
success: () => {
console.log('success');
onLocationChange(function(result) {
console.log('change', result.longitude, result.latitude);
});
onLocationChangeError(function(locationChangeError) {
console.log(
'onLocationChangeError:',
locationChangeError.errorCode,
locationChangeError.errorInfo,
locationChangeError.locationDetail
);
});
},
});
},
getLocationForegroundService() {
startLocationUpdateBackground({
success: () => {
console.log('开始持续定位(使用前台服务)');
onLocationChange(function(result) {
console.log('change', result.longitude, result.latitude);
});
onLocationChangeError(function(locationChangeError) {
console.log(
'onLocationChangeError:',
locationChangeError.errorCode,
locationChangeError.errorInfo,
locationChangeError.locationDetail
);
});
},
fail: (error) => {
console.log(error);
},
complete: () => {
console.log('complete');
}
});
},
stopMapLocationUpdate() {
stopLocationUpdate({
success: () => {
console.log('success');
},
fail: (error) => {
console.log(error);
},
complete: () => {
console.log('complete');
}
});
}
}
}
</script>
具体方法
startLocationUpdate(options)
启动持续定位,必须用调用这个方法,然后才能在onLocationChange获取到位置信息。
参数
options,具体见下文
类型:GetLocationOptions
必填:是
默认值:无
使用示例
import { startLocationUpdate } from 'hr-getLocation-amap';
startLocationUpdate({
success: function() {
console.log('开始定位');
},
fail: function(err) {
console.error('定位失败: ', err);
},
complete: function() {
console.log('定位完成');
}
});
startLocationUpdateBackground(options):
应用进入后台的持续定位(使用前台服务,忽略电池优化)
参数
options
类型:GetLocationOptions
必填:是
默认值:无,
注意:如果要使用忽略电池优化,参数中要传入
- enableBatteryOptimization,值为true,表示开启,默认为false。
- requestIgnoreBatteryOptimizationCode,这是一个整数,随意配置,保持唯一即可,
使用示例
import { startLocationUpdateBackground } from 'hr-getLocation-amap';
startLocationUpdateBackground({
needFullAccuracy: true,
enableBatteryOptimization: true,
requestIgnoreBatteryOptimizationCode: 34343428,
success: function() {
console.log('开始后台持续定位');
},
fail: function(err) {
console.error('后台持续定位失败: ', err);
},
complete: function() {
console.log('后台持续定位完成');
}
});
stopLocationUpdate(stopLocationOptions)
停止持续定位。
参数
stopLocationOptions
类型:StopLocationOptions
必填:否
默认值:无
使用示例
import { stopLocationUpdate } from 'hr-getLocation-amap';
stopLocationUpdate({
success: function() {
console.log('持续定位已停止');
},
fail: function(err) {
console.error('停止持续定位失败: ', err);
},
complete: function() {
console.log('停止持续定位完成');
}
});
onLocationChange(callback)
设置位置变化时的回调函数。
参数
callback
类型:(result: any) => void
必填:是
使用示例
import { onLocationChange } from 'hr-getLocation-amap';
onLocationChange(function(result) {
console.log('位置变化: ', result);
});
定位结果result数据
{
accuracy: location.getAccuracy(), // 获取定位精度 单位:米
adCode: location.getAdCode(), // 获取区域编码
address: location.getAddress(), // 获取地址信息
altitude: location.getAltitude(), // 获取海拔高度(单位:米)
aoiName: location.getAoiName(), // 获取兴趣面名称
bearing: location.getBearing(), // 获取方向角(单位:度)
buildingId: location.getBuildingId(), // 返回支持室内定位的建筑物ID信息
city: location.getCity(), // 获取城市名称
cityCode: location.getCityCode(), // 获取城市编码
conScenario: location.getConScenario(), // 室内外置信度
coordType: location.getCoordType(), // 获取坐标系类型
country: location.getCountry(), // 获取国家名称
description: location.getDescription(), // 获取位置语义信息
district: location.getDistrict(), // 获取区的名称
errorCode: location.getErrorCode(), // 获取错误码
errorInfo: location.getErrorInfo(), // 获取错误信息
extras: location.getExtras(), // 获取额外的信息
floor: location.getFloor(), // 获取室内定位的楼层信息
gpsAccuracyStatus: location.getGpsAccuracyStatus(), // 获取卫星信号强度
latitude: location.getLatitude(), // 获取纬度
locationDetail: location.getLocationDetail(), // 获取定位信息描述
locationQualityReport: location.getLocationQualityReport(), // 获取定位质量
locationType: location.getLocationType(), // 获取定位结果来源
longitude: location.getLongitude(), // 获取经度
poiName: location.getPoiName(), // 获取兴趣点名称
provider: location.getProvider(), // 获取定位提供者
province: location.getProvince(), // 获取省的名称
road: location.getRoad(), // 获取街道名称
satellites: location.getSatellites(), // 获取当前可用卫星数量
speed: location.getSpeed(), // 获取当前速度(单位:米/秒)
street: location.getStreet(), // 获取街道名称
streetNum: location.getStreetNum(), // 获取门牌号
trustedLevel: location.getTrustedLevel(), // 获取定位结果的可信度
locationTime: Date.now(),// 定位时间
}
onLocationChangeError(callback)
设置定位错误时的回调函数。
参数
callback
类型:(error: any) => void
必填:是
使用示例
import { onLocationChangeError } from 'hr-getLocation-amap';
onLocationChangeError(function(error) {
console.error('定位错误: ', error);
});
offLocationChange(callback)
移除位置变化的回调函数。
参数
callback
类型:(result: any) => void
必填:是
使用示例
import { offLocationChange } from 'hr-getLocation-amap';
offLocationChange(function(result) {
console.log('已移除位置变化监听');
});
options
类型:GetLocationOptions
必填:是
默认值:无
GetLocationOptions 的属性值
属性名称 | 类型 | 必填 | 默认值 | 描述 |
---|---|---|---|---|
type | string |
否 | gcj02 |
默认为 gcj02 返回可用于 uni.openLocation 的坐标。支持的坐标系有: GPS - 全球定位系统坐标系:最普遍的坐标系统,由全球定位系统(GPS)提供原始数据。在全球范围内被广泛应用。 GCJ02 - 火星坐标系:由中国国家测绘局制定的坐标系统。谷歌地图和高德地图在中国大陆版中使用的坐标系。它对WGS-84进行了加密处理,以符合中国的法律法规。 BAIDU - 百度坐标系:特有的坐标系统,由百度地图使用。它是在国测局坐标的基础上,加密后的坐标体系。 MAPBAR - 图吧坐标系:图吧地图服务所使用的坐标系。 MAPABC - 图盟坐标系:由图盟地图服务使用的坐标系。 SOSOMAP - 腾讯/搜搜地图坐标系:腾讯地图使用的坐标系,与腾讯的其他地图服务相关联。 ALIYUN - 阿里云坐标系:阿里云地图服务使用的坐标系。 GOOGLE - 谷歌坐标系:谷歌地图使用的坐标系。在国际上广泛使用,但在中国大陆有所偏移。 |
altitude | boolean |
否 | false |
传入 true 会返回高度信息。由于获取高度需要较高精确度,会减慢接口返回速度。 |
geocode | boolean |
否 | false |
传入 true 会解析并返回地址信息,会减慢接口返回速度。高德内部对应 isNeedAddress 。 |
highAccuracyExpireTime | number |
否 | 3000 |
高精度定位超时时间(毫秒),指定时间内返回最高精度。该值3000ms以上高精度定位才有效果。 |
isHighAccuracy | boolean |
否 | false |
开启高精度定位。在内部设置了定位模式mode |
success | GetLocationSuccessCallback |
否 | 无 | 接口调用成功的回调函数。 |
fail | GetLocationFailCallback |
否 | 无 | 接口调用失败的回调函数。 |
complete | GetLocationCompleteCallback |
否 | 无 | 接口调用结束的回调函数(调用成功、失败都会执行)。 |
isLocationCacheEnable | boolean |
否 | false |
是否启用定位缓存策略。 |
interval | number |
否 | 2000 |
定位间隔,单位毫秒。 |
isOnceLocationLatest | boolean |
否 | false |
是否获取最近3秒内精度最高的一次定位结果。 |
isSensorEnable | boolean |
否 | false |
是否开启设备传感器,当设置为true时,网络定位可以返回海拔、角度和速度。 |
isWifiActiveScan | boolean |
否 | true |
是否主动刷新wifi以提高定位精度。 |
httpTimeOut | number |
否 | 30000 |
网络定位请求的超时时间,单位毫秒。 |
isGpsFirst | boolean |
否 | false |
是否GPS优先,只在高精度模式下有效。如果需要很高精度,可以设置为true,isGpsFirst(),为true时,会等待卫星定位结果返回,最多等待30秒,若30秒后仍无卫星定位结果返回,返回网络定位结果;可以通过 AMapLocationClientOption.setGpsFirstTimeout(long) |
protocol | AMapLocationProtocol |
否 | HTTP |
网络请求使用的协议。 |
geoLanguage | GeoLanguage |
否 | DEFAULT |
设置逆地理信息的语言。 |
enableBatteryOptimization | boolean |
否 | false |
是否忽略电池优化。 |
requestIgnoreBatteryOptimizationCode | number |
否 | 无 | 请求忽略电池优化时的请求代码。 |
提高定位精度的建议
定位精度对于许多应用来说至关重要,特别是那些依赖于精确地理位置数据的应用。以下是一些提高定位精度的有效方法:
1. 使用高精度定位模式
- 启用GPS:GPS提供最精确的定位信息。确保应用在需要高精度定位时启用GPS。配置项为isHighAccuracy,默认开启。
- 结合网络定位:同时使用Wi-Fi和蜂窝网络定位可以在室内或GPS信号弱的地区提供更好的定位结果。配置项为isWifiActiveScan(默认开启)。
- 配置isOnceLocationLatest: 设置定位是否等待WIFI列表刷新 定位精度会更高,但是定位速度会变慢1-3秒 从高德sdk3.7.0版本开始,支持连续定位(连续定位时首次会等待刷新) 3.7.0之前的版本,仅适用于单次定位,当设置为true时,连续定位会自动变为单次定位;
2. 利用设备传感器
- 加速度计和陀螺仪:帮助判断设备的移动和方向。
- 磁力计:提供方向信息,增强方向感。
- 气压计:在一些设备上,气压计可以帮助确定海拔高度。
- 配置项为isSensorEnable(默认关闭)。
3. 适当的定位更新策略
- 动态调整定位频率:根据应用的需要和用户的当前活动状态动态调整定位更新的频率。
- 批量定位:如果可能,使用批量定位来减少电池消耗,同时获取足够的数据来提高精度。对返回的定位结果根据类型进行过滤;
4. 软件层面的优化
- 算法优化:使用先进的算法来过滤噪声和不准确的定位数据。
- 数据融合:综合不同来源的数据来提高定位的准确性和可靠性。
5. 用户引导和反馈
- 用户引导:引导用户如何在他们的设备上启用或改善定位服务。
- 反馈机制:提供一种方式让用户报告定位问题,以帮助进一步优化定位服务。
应用这些策略可以在很大程度上提高应用的定位精度,从而提升用户体验和应用性能。