更新记录

1.0.3(2024-02-04)

使用complieOnly避免与uni内置定位功能冲突

1.0.2(2024-01-30)

简单自测

1.0.1(2024-01-26)

完善readme.md

查看更多

平台兼容性

uni-app

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
√ √ - - - - 4.4 × -
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
- - - - - - - - - - - -

uni-app x

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 × - -

其他

多语言 暗黑模式 宽屏模式 蒸汽模式
× × × √

hr-getLocation-amap

使用高德定位sdk获取当前的地理位置信息,如经纬度,地址,高度和速度等多种信息,具体一定的保活能力,特点:

  • 支持单次定位;
  • 支持前台连续定位;
  • 支持应用进入后台后,通过开启前台服务,忽略电池优化来持续定位获取位置信息,拥有一定的保活能力;
  • api和原uni.getLocation等基本保持一致,原使用uni相关API的代码可使用替换方法名的方式快速修改;

使用过程中有什么问题,希望大家及时和我反馈,***: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. 用户引导和反馈

  • 用户引导:引导用户如何在他们的设备上启用或改善定位服务。
  • 反馈机制:提供一种方式让用户报告定位问题,以帮助进一步优化定位服务。

应用这些策略可以在很大程度上提高应用的定位精度,从而提升用户体验和应用性能。

隐私、权限声明

1. 本插件需要申请的系统权限列表:

无

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

无

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无