更新记录
1.0.0(2025-07-23)
- 初次提交,功能如预览图所示,参考示例项目使用。
平台兼容性
uni-app(4.31)
Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | Android插件版本 | iOS | 鸿蒙 |
---|---|---|---|---|---|---|---|---|---|
- | - | × | × | - | × | 6.0 | 1.0.0 | × | × |
微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 快应用-华为 | 快应用-联盟 |
---|---|---|---|---|---|---|---|---|---|---|
× | × | × | × | × | × | × | × | × | × | × |
uni-app x(4.31)
Chrome | Safari | Android | Android插件版本 | iOS | 鸿蒙 | 微信小程序 |
---|---|---|---|---|---|---|
× | × | 6.0 | 1.0.0 | × | × | × |
其他
多语言 | 暗黑模式 | 宽屏模式 |
---|---|---|
× | × | √ |
前言
- 插件采用高德sdk,默认使用高精度定位模式,返回结果为火星坐标系(GCJ02),可转换国际坐标
- 调用方法会自动申请权限,如果用户拒绝权限会告知开发者,开发者可以自行制定用户拒绝后的流程。
- 本插件是在安卓系统下以合法的方式提供后台定位,但是请注意允许后台定位不等于可以后台联网,大多数系统都不允许熄屏后的后台联网行为,所以不建议在后台实时上传位置。
- 插件提供了一个简单的数据库存取功能,方便你保存每次定位数据,在合适的时机取出来上传到服务器。
- 点击下载演示程序,需在电脑端下载,手机端不支持
- 该插件属于高德API插件,没有包含高德地图组件,做到了轻量化,如果需要使用地图可以集成我的地图组件插件甚至其他地图也行。
- 目前高德已经开始频繁找开发者支付授权费了,使用的时候注意调用频率不要太高!商用还是给钱吧。
接入步骤
- 请先在高德开放平台申请你的appkey
- 导入插件包到uni_modules下
- 打包自定义基座,打包好后最好重启一次HBX,非常重要,否则无法调用插件
- 导入示例项目
//完整代码导入示例项目查看 <script> import * as SlyUtsAMapHelper from '@/uni_modules/Sly-UTSAMapLocSearch' export default { data():{ return{} }, methods:{ //.... } } </script>
可调用方法说明
方法 | 说明 | 参数说明 | 返回结果 |
---|---|---|---|
initKey(key:string) | [[核心]]()初始化高德sdk | 高德开放平台申请的key | true/false |
getLocation(object) | [[核心]]()开始定位,单次或持续,自动处理权限 | 方法参数说明1 | 定位返回结果 |
stopLocation() | [[核心]]()停止定位(单次定位无需调用) | 无 | 无 |
openPermissionPage(isSimple:boolean) | 主动打开内部权限申请页面,一般不需要主动调用,定位的时候会主动处理 | [isSimpleMode=false] 是否简易模式,简易模式下只申请[后台定位]一个权限,不申请[通知][忽略电池优化]权限 | 无 |
isTrackPermissionOk(isSimple:boolean) | 检查持续定位所需的权限是否设置完毕(不包括特殊机型的手动设置项) | 同上 | bool |
calcDistance(lnglat1:number[], lnglat2:number[]) | 计算坐标距离(通用,与坐标系无关) | 坐标1和坐标2,经度在前纬度在后的二维数组 | 数字,单位米 |
reGeoQuery(object) | 坐标反查地理信息 | 方法参数说明2 | object,打印获取 |
routePlan(object) | 唤起外部高德或百度地图进行路线导航(内部优先使用高德) | 方法参数说明3 | 无 |
getDBInstance() | 获取数据库操作对象 | 内置方法参数说明4 | 无 |
gcj02toWgs84(lng:number,lat:number) | gcj02坐标转wgs84坐标 | 经度,纬度 | 长度为2的double数组, 经度在前纬度在后 |
gcj02ToBd09(lng,lat) | gcj02坐标转bd09坐标 | 同上 | 同上 |
bd09ToWgs84(lng,lat) | 如题 | 同上 | 同上 |
bd09ToGcj02(lng,lat) | 如题 | 同上 | 同上 |
wgs84ToGcj02(lng,lat) | 如题 | 同上 | 同上 |
wgs84ToBd09(lng,lat) | 如题 | 同上 | 同上 |
getLocation(object)方法的参数说明
{
isTrack ?: boolean,//是否持续定位(当这个为true时,下面的所有参数才有效)
intervalTime ?: number,//定位间隔时间,单位ms,最小值1000
spacing ?: number,//有效移动距离,单位m,移动距离大于等于该值才会回调:0
notificationTitle ?: string,//通知栏标题:"位置追踪服务"
notificationContent ?: string,//通知栏内容:"正在跟踪你的位置"
enableTrackExplain ?: string,//开启后台定位的解释说明,对用户说明为什么需要后台定位:"后台持续定位需要打开一些权限设置,点击确定前往打开"
isSimpleMode ?: boolean,//是否开启简单模式,该模式下只会申请“后台定位”一个权限,忽略通知权限和省电策略设置,不建议开启
isAlwaysAsk ?: boolean,//目前该参数仅对华为系的机子生效,每次持续定位前都会询问是否打开了他们的专属设置,并给出了图文教程,因为无法检测他是否打开了,所以最好询问一下。如果实在不想弹窗,可以在开始定位后再在本地记录一个标识来记录用户已经看过弹窗了
isReGeocode ?: () => boolean,//定位时是否返回地理信息(会消耗逆地理编码用量)
compelet : (res : LocationResult) => void,//查看下方”定位返回结果“
};
reGeoQuery(object)方法的参数说明
export type ReGeoOptions = {
lng : number; //经度
lat : number;//纬度
radius : number;//半径(米)
compelet : (res : typeof {
errorCode : number;//错误码,0成功,其它则错误
data : string;
}) => void
}
routePlan(object)方法的参数说明
{
slat ?: number;//起点纬度。如果不填写此参数则自动将用户当前位置设为起点纬度。
slng ?: number;
sname ?: string;//起点名称
dlat : number;//终点纬度
dlng : number;
dname ?: string;
}
getDBInstance()以及内置方法说明
插件内置了一个数据库(所在路径:/storage/Android/data/${应用包名}/files/slylocation.db)
可用于记录查询每次定位结果,其中包含一张表:tb_loc_record,表中包含5个字段:
{
_id:主键,int,自增;
batch_tag:记录的批次标记, TEXT,
loc_res: 记录的定位结果, TEXT,
state:保存的状态,初始为0 INTEGER,
create_time:记录时的时间戳 INTEGER
}
调用示例:
const dbHelper = SlyUtsAMapHelper.getDBInstance();
dbHelper.insert(...)
内置方法如下:
====================
/**
* @description 插入一条新记录
* @param batch_tag 本次的记录批次标记
* @param loc_res 本次记录的定位数据,一般是json字符串
* @param compelet 记录完成的回调
*/
function insert(batch_tag : string, loc_res : string, compelet : () => void);
====================
/**
* @description 查询数据库
* @param options.latterSql sql后段语句,以where开头,例如: where state=0
* @param options.compelet 回调函数(res:{errcode:number,data:string})=>void
}
*/
function query(options : typeof {
latterSql : string, //后段sql语句,内置前段语句“SELECT * from ${DBHelper.TB_NAME}”
compelet : (res : typeof {
errorCode : number;//错误码,0成功,其它则错误
data : string;
}) => void
})
====================
/**
* @description 更新数据库
* @param options.latterSql sql后段语句,以SET开头,例如: SET state=1 where _id=1
* @param options.compelet 回调函数(res:{errcode:number,data:string})=>void
}
*/
function update(options : typeof {
latterSql : string, //后段sql语句,内置前段语句“UPDATE ${DBHelper.TB_NAME}”
compelet : (res : typeof {
errorCode : number;//错误码,0成功,其它则错误
data : string;
}) => void
})
====================
/**
* @description 删除表中指定数据
* @param options.latterSql sql后段语句,以where开头,例如: where state=0
* @param options.compelet 回调函数(res:{errcode:number,data:string})=>void
}
*/
function delete(options : typeof {
latterSql : string, //后段sql语句,内置前段语句“DELETE FROM ${DBHelper.TB_NAME}”
compelet : (res : typeof {
errorCode : number;//错误码,0成功,其它则错误
data : string;
}) => void
})
====================
/**
* @description 获取数据库的表名称:tb_loc_record
*/
function getTbName()
定位返回结果(部分)
字段 | 类型 | 说明 |
---|---|---|
errorCode | int | 错误码,0成功;详情参考下方对照表 |
errorInfo | string | 错误信息 |
coordType | string | 坐标系类型,"GCJ02","WGS84" |
locationType | int | 定位类型,1:GPS,2:前次定位结果;详情参考下方对照表 |
time | long | 定位时间,毫秒 |
formatTime | string | 格式化定位时间:2021-09-17 18:00:00 |
longitude | double | 经度 |
latitude | double | 纬度 |
accuracy | float | 定位精度,单位米 |
speed | float | 移动速度,单位米/秒,室外有效 |
altitude | double | 海拔高度,单位米,室外有效 |
bearing | float | 方向角度【0,360】,其中0度表示正北方向,90度表示正东,180度表示正南,270度表示正西;室外有效 |
direction | string | 方向中文释义 |
address | string | 地址 |
description | string | 位置语义信息 |
country | string | 国家 |
provider | string | 省份 |
city | string | 城市 |
district | string | 行政区 |
street | string | 街道 |
cityCode | int | 城市编码 |
adCode | int | 地区编码 |
satellites | int | 卫星数量 |
更多结果可打印查看
参考链接:完整结果解释 https://amappc.cn-hangzhou.oss-pub.aliyun-inc.com/lbs/static/unzip/Android_Location_Doc/com/amap/api/location/AMapLocation.html 请下滑至方法概要处
常见问题
-
Q:定位精度不够,实际位置发生较大偏移
A:定位偏移属于正常现象,尤其在室内,在室外时偶尔也会出现点位偏移,此时可以判断返回坐标的小数点后的数字个数进行精度过滤。
代码示例
//查看小数点后有几位 const longStr = String(res.longitude); const latStr = String(res.latitude); const longAccLength = longStr.substring(longStr.indexOf(".") + 1).length; const latAccLength = latStr.substring(latStr.indexOf(".") + 1).length; //只要有一个的小数位大于等于4就算合格 const isOk = longAccLength >= 4 || latAccLength >= 4;
-
Q:开始定位后连续返回0,0坐标
A:该现象意味定位失败,请自行过滤掉,详见高德官方解释 https://lbs.amap.com/faq/android/location-sdk/position/43313。
-
Q:息屏后一段时间,后台位置数据不再更新
A:因为手机系统可能会禁止熄屏后的后台联网行为, 所以不建议在后台实时上传位置,建议使用内部DBHelper先保存定位信息到本地数据库,然后再从里面取出来上传, 上传成功后删除,就算息屏后上传失败了,定位数据也不会丢失。
-
Q:华为/荣耀手机开启了权限后,每次持续定位前还是会弹窗提示
A:把isAlwaysAsk设为false就行了。这是因为华为/荣耀手机有个特殊的手动设置项,因为无法检测他是否打开了,所以每次持续定位前都会询问。如果实在不想弹窗, 可以在开始定位后再在本地记录一个标识来记录用户已经看过弹窗了。
坐标系小知识
因为国内的坐标系必须至少使用GCJ02标准,插件中转换WGS84坐标的方式是内部通过网上公开算法转换而来的。经测试,转换后的wgs84坐标放到谷歌地球上是正确的
- 地球坐标系WGS84:常见于 GPS 设备,Google 地图等国际标准的坐标体系。
- 火星坐标系GCJ-02:中国国内使用的被强制加密后的坐标体系,高德坐标就属于该种坐标体系。
- 百度坐标系BD-09:百度地图所使用的坐标体系,是在火星坐标系的基础上又进行了一次加密处理。