更新记录

1.1.0(2023-03-03)

本次主要更新: 1.增加ios版本

1.0.0(2023-03-01)

新版首发


平台兼容性

Android Android CPU类型 iOS
适用版本区间:4.4 - 12.0 armeabi-v7a:支持,arm64-v8a:支持,x86:支持 适用版本区间:11 - 16

原生插件通用使用流程:

  1. 购买插件,选择该插件绑定的项目。
  2. 在HBuilderX里找到项目,在manifest的app原生插件配置中勾选模块,如需要填写参数则参考插件作者的文档添加。
  3. 根据插件作者的提供的文档开发代码,在代码中引用插件,调用插件功能。
  4. 打包自定义基座,选择插件,得到自定义基座,然后运行时选择自定义基座,进行log输出测试。
  5. 开发完毕后正式云打包

付费原生插件目前不支持离线打包。
Android 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/android
iOS 离线打包原生插件另见文档 https://nativesupport.dcloud.net.cn/NativePlugin/offline_package/ios

注意事项:使用HBuilderX2.7.14以下版本,如果同一插件且同一appid下购买并绑定了多个包名,提交云打包界面提示包名绑定不一致时,需要在HBuilderX项目中manifest.json->“App原生插件配置”->”云端插件“列表中删除该插件重新选择


KJ-GNSS

系统定位完整版

注意

andorid:位置提供者 "network"和"passive",地理编码和反地理编码,可能有些手机不支持,google服务被墙

反地理编码可使用reverseGeocodeV2,不受google服务影响

测试手机:小米、华为鸿蒙系统

请试用合适再购买

使用

<<template>
    <view class="content">
        <view style="text-align: center;">------权限-------</view>
        <button type="primary" @click="isProviderEnabled">GPS是否开启(android)</button>
        <button type="primary" @click="gotoLocationSetting">跳转定位设置页面</button>
        <button type="primary" @click="judgePermission">获取权限状态(ios)</button>
        <button type="primary" @click="requestPermission">请求权限(ios)</button>

        <view style="text-align: center;">------andorid位置提供者-------</view>
        <button type="primary" @click="getProviders">获取可用位置提供者(android)</button>
        <button type="primary" @click="getAllProviders">获取所有位置提供者(android)</button>
        <button type="primary" @click="getBestProvider">获取最佳的位置提供者(android)</button>

        <view style="text-align: center;">------定位-------</view>
        <button type="primary" @click="getLastKnownLocation">获取最新位置(android)</button>
        <button type="primary" @click="requestLocation">单次定位(ios)</button>
        <button type="primary" @click="startUpdatingLocation">开始持续定位</button>
        <view class="json">{{startUpdatingLocationJson}}</view>
        <button type="primary" @click="stopUpdatingLocation">取消持续定位</button>

        <view style="text-align: center;">------正反地理编码-------</view>
        <button type="primary" @click="reverseGeocode">反地理编码</button>
        <view class="json">{{reverseGeocodeJson}}</view>
        <button type="primary" @click="reverseGeocodeV2">反地理编码V2(andorid),不受google服务影响</button>
        <view class="json">{{reverseGeocodeV2Json}}</view>
        <button type="primary" @click="geocode">地理编码</button>
        <view class="json">{{geocodeJson}}</view>

        <view style="text-align: center;">------以下方法andorid7.0以上才支持-------</view>
        <button type="primary" @click="registerGnssStatus">注册监听卫星信息(GNSS处理后信息)</button>
        <view class="json">{{registerGnssStatusJson}}</view>
        <button type="primary" @click="unregisterGnssStatus">取消注册监听卫星信息</button>
        <button type="primary" @click="registerGnssMeasurements">注册监听卫星信息(GNSS测量原始信息)</button>
        <view class="json">{{registerGnssMeasurementsJson}}</view>
        <button type="primary" @click="unregisterGnssMeasurements">取消注册监听卫星信息</button>
    </view>
</template>

<script>
    var KJGNSS = uni.requireNativePlugin("KJ-GNSS");
    export default {
        data() {
            return {
                startUpdatingLocationJson: "",
                reverseGeocodeJson: "",
                reverseGeocodeV2Json: "",
                geocodeJson: "",
                registerGnssStatusJson: "",
                registerGnssMeasurementsJson: ""
            }
        },
        onLoad() {
            if (plus.os.name == 'Android') {
                plus.android.requestPermissions(
                    ['android.permission.ACCESS_FINE_LOCATION',
                        'android.permission.ACCESS_COARSE_LOCATION'
                    ],
                    function(resultObj) {
                        var result = 0;
                        for (var i = 0; i < resultObj.granted.length; i++) {
                            var grantedPermission = resultObj.granted[i];
                            console.log('已获取的权限:' + grantedPermission);
                            result = 1
                        }
                        for (var i = 0; i < resultObj.deniedPresent.length; i++) {
                            var deniedPresentPermission = resultObj.deniedPresent[i];
                            console.log('拒绝本次申请的权限:' + deniedPresentPermission);
                            result = 0
                        }
                        for (var i = 0; i < resultObj.deniedAlways.length; i++) {
                            var deniedAlwaysPermission = resultObj.deniedAlways[i];
                            console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
                            result = -1
                        }
                    },
                    function(error) {
                        console.log('申请权限错误:' + error.code + " = " + error.message);
                    }
                );
            }
        },
        methods: {
            isProviderEnabled() {
                var dic = {
                    "provider": "gps" //位置提供者
                }
                KJGNSS.isProviderEnabled(dic, (res) => {
                    console.log("isProviderEnabled:" + JSON.stringify(res));
                });
            },
            gotoLocationSetting() {
                KJGNSS.gotoLocationSetting();
            },
            judgePermission() {
                KJGNSS.judgePermission((res) => {
                    console.log("judgePermission:" + JSON.stringify(res));
                });
            },
            requestPermission() {
                KJGNSS.requestPermission((res) => {
                    console.log("requestPermission:" + JSON.stringify(res));
                });
            },
            getProviders() {
                var dic = {
                    "enabledOnly": true //表示仅获取可用的位置提供者
                }
                KJGNSS.getProviders(dic, (res) => {
                    console.log("getProviders:" + JSON.stringify(res));
                });
            },
            getAllProviders() {
                KJGNSS.getAllProviders((res) => {
                    console.log("getAllProviders:" + JSON.stringify(res));
                });
            },
            getBestProvider() {
                var dic = {
                    "accuracy": 2, //表示纬度和经度的理想精度  1-精度低,误差大于500米 2-精度中等,误差在100米到500米之间 3-精度高,误差小于100米
                    //"bearingAccuracy":2,//指示所需的轴承精度 
                    //"horizontalAccuracy":2,//指示所需的水平精度(经度和纬度)
                    //"speedAccuracy":2,//指示所需的速度准确度
                    //"verticalAccuracy":2,//指示所需的垂直精度(高度)
                    "powerRequirement": 1, //对电源的需求 1-耗电低 2-耗电中等 3-耗电高
                    "altitudeRequired": false, //指示提供者是否必须提供海拔信息
                    "bearingRequired": false, //指示提供者是否必须提供方位信息
                    "costAllowed": false, //指示提供者是否被允许产生货币成本
                    "speedRequired": false, //指示提供者是否必须提供速度信
                    "enabledOnly": true //表示仅获取可用的位置提供者
                }
                KJGNSS.getBestProvider(dic, (res) => {
                    console.log("getBestProvider:" + JSON.stringify(res));
                });
            },
            getLastKnownLocation() {
                var dic = {
                    "provider": "gps" //位置提供者
                }
                KJGNSS.getLastKnownLocation(dic, (res) => {
                    console.log("getLastKnownLocation:" + JSON.stringify(res));
                });
            },
            requestLocation() {
                var dic = {
                    "desiredAccuracy": 1,
                    "distanceFilter": 10,
                    "allowsBackgroundLocationUpdates": true,
                    "showsBackgroundLocationIndicator": true,
                    "pausesLocationUpdatesAutomatically": false
                }
                KJGNSS.requestLocation(dic, (res) => {
                    console.log("requestLocation:" + JSON.stringify(res));

                });
            },
            startUpdatingLocation() {
                var dic;
                if (plus.os.name == 'Android') {
                    dic = {
                        "providers": ["gps", "network", "passive"], //位置提供者数组,优先gps
                        "minTime": 1000, //更新的最小时间
                        "minDistance": 1 //更新的最小距离
                    }
                } else {
                    dic = {
                        "isSingleLocation": false,
                        "desiredAccuracy": "Best", //BestForNavigation(最精准) Best(最好的,米级) NearestTenMeters(十米) HundredMeters(百米) Kilometer(一公里) ThreeKilometers(三公里)
                        "distanceFilter": 10, //刷新距离
                        "allowsBackgroundLocationUpdates": false, //是否开启后台定位,为true 需要配置manifest.json->App常用其它设置->后台运行能力 location
                        "showsBackgroundLocationIndicator": false, //是否显示后台定位提示(状态栏蓝色背景)
                        "pausesLocationUpdatesAutomatically": false //定位是否会被系统自动暂停
                    }
                }
                KJGNSS.startUpdatingLocation(dic, (res) => {
                    console.log("startUpdatingLocation:" + JSON.stringify(res));
                    this.startUpdatingLocationJson = JSON.stringify(res)
                    if (plus.os.name == 'Android') {
                        //返回参数说明参考:https://www.xfqiao.com/api/android-zh/android/location/Location.html
                        /**
                         * {"method":"onLocationChanged","result":{"longitude":113.281456,"time":1687341181822,"hasBearing":false,"accuracy":40,"elapsedRealtimeNanos":1239298029066278,"provider":"network",
                         * "hasAccuracy":true,"bearing":0,"isFromMockProvider":false,"hasSpeed":false,"latitude":23.07654,"speed":0,"hasAltitude":false,"altitude":0}}
                         * isFromMockProvider - 如果位置来自模拟提供者,则返回true。
                         * */
                        if (res.method == "onLocationChanged") {
                            this.reverseGeocode(res.result.latitude, res.result.longitude)
                            this.reverseGeocodeV2(res.result.latitude, res.result.longitude)
                        }
                    } else {
                        /**
                         * {"result":[{"course":-1,"speed":-1,"longitude":113.2814133388547,"horizontalAccuracy":43,
                         * "timestamp":"2023-06-21 18:01:04","latitude":23.076741614788542,"courseAccuracy":-1,
                         * "ellipsoidalAltitude":1.8153233528137207,"altitude":8.372057914733887,"speedAccuracy":-1}]}
                         * course - 航向 位置的路线(以正北度数为单位)。如果无效,则为否定。0.0-359.9度,0为正北
                         * horizontalAccuracy - 水平的准确度(负数无效)
                         * ellipsoidalAltitude - WGS 84参考系下位置的椭球高度
                         * courseAccuracy - 航向精度(以度为单位)。如果无效,则返回负数。
                         * altitude - 海拔高度 可以是正(海平面以上)或负(海平面以下)
                         * speed - 速度 单位为m/s。如果速度无效,则为负数。
                         * speedAccuracy - 速度精度 单位为m/s。如果无效,则返回-1
                         * */
                        var arr = res.result;
                        var dic = arr[arr.length - 1];
                        this.reverseGeocode(dic.latitude, dic.longitude)
                    }
                });
            },
            stopUpdatingLocation() {
                KJGNSS.stopUpdatingLocation();
            },
            reverseGeocode(latitude, longitude) {
                var dic = {
                    "latitude": latitude,
                    "longitude": longitude,
                    "maxResults": 1 //最大返回的结果,andorid才有
                }
                KJGNSS.reverseGeocode(dic, (res) => {
                    console.log("reverseGeocode:" + JSON.stringify(res));
                    this.reverseGeocodeJson = JSON.stringify(res)
                    var arr = res.result;
                    var dic = arr[arr.length - 1];
                    this.geocode(dic.adminArea + dic.locality + dic.subLocality + dic.fetFeatureName);
                });
            },
            reverseGeocodeV2(latitude, longitude) {
                var dic = {
                    "latitude": latitude,
                    "longitude": longitude,
                }
                KJGNSS.reverseGeocodeV2(dic, (res) => {
                    console.log("reverseGeocodeV2:" + JSON.stringify(res));
                    this.reverseGeocodeV2Json = JSON.stringify(res)
                });
            },
            geocode(address) {
                var dic = {
                    "address": address,
                    "maxResults": 1 //最大返回的结果,andorid才有
                }
                KJGNSS.geocode(dic, (res) => {
                    console.log("geocode:" + JSON.stringify(res));
                    this.geocodeJson = JSON.stringify(res)
                });
            },
            registerGnssStatus() {
                KJGNSS.registerGnssStatus((res) => {
                    console.log("registerGnssStatus:" + JSON.stringify(res));
                    //返回参数说明参考:https://www.xfqiao.com/api/android-zh/android/location/GnssStatus.html
                    this.registerGnssStatusJson = JSON.stringify(res)
                });
            },
            unregisterGnssStatus() {
                KJGNSS.unregisterGnssStatus();
            },
            registerGnssMeasurements() {
                KJGNSS.registerGnssMeasurements((res) => {
                    console.log("registerGnssMeasurements:" + JSON.stringify(res));
                    //返回参数说明参考:https://www.xfqiao.com/api/android-zh/android/location/GnssMeasurementsEvent.html
                    this.registerGnssMeasurementsJson = JSON.stringify(res)
                });
            },
            unregisterGnssMeasurements() {
                KJGNSS.unregisterGnssMeasurements();
            }
        }
    }
</script>
<style>
    button {
        font-size: 15px
    }

    .json {
        word-wrap: break-word;
    }
</style>

隐私、权限声明

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

andorid:android.permission.ACCESS_COARSE_LOCATION 、 android.permission.ACCESS_FINE_LOCATION

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

插件不采集任何数据

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

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