更新记录

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小程序
HBuilderX 3.6.8,Android:4.4,iOS:不支持 × × × × × ×
钉钉小程序 快手小程序 飞书小程序 京东小程序
× × × ×
H5-Safari Android Browser 微信浏览器(Android) QQ浏览器(Android) Chrome IE Edge Firefox PC-Safari
× × × × × × × × ×

hr-getLocation-amap

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

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

使用过程中有什么问题,希望大家及时和我反馈,qq群:485608318。

使用步骤

一、安装本插件;

二、配置您的应用的minSdkVersiontargetSdkVersion

  • 在项目的根目录中的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. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。

使用中有什么不明白的地方,就向插件作者提问吧~ 我要提问