zoukankan      html  css  js  c++  java
  • 基于腾讯位置服务定位实现物业巡检防作弊场景

    前言

    在物业管理中,小区内人员巡检还是非常常见的工作之一,为了降低物业的投入,设计了采用扫描二维码的形式辅助系统检测每个员工巡检的位置,以便进行常规的物业巡检工作。虽然二维码既便宜又易用,然而由于其可拍照和被动的模式,会导致作弊的问题,因此在常规的扫码中,需要增加定位功能以便辅助系统鉴别作弊行为。

    系统的方案设计

    巡检任务按照端的不同,分为两部分,一部分在App内实现,一部分在PC后台实现,其分工大抵如下:

    • PC端: 对巡检任务进行定义并分派,不同的人员分派不同的巡检任务。当人员通过app进行巡检后,后台可以查询任务的完成情况,通过二维码确定每个巡检点都巡检过,通过人员的位置历史对巡检任务的人员轨迹进行回放。因为没有引入电子围栏,所以只能按照轨迹人工判断是否作弊。不过本身防止作弊的问题就是一种威慑,因此效果并不会太差。

    • App端:人员通过App进行登录,登录后获取自己的巡检任务,按照巡检的指示,对各个巡检点进行扫码打卡。app在打开后开启连续定位,并按照一定的速率定时上传到位置库。

    image.png

    由于是应用在小区的巡检工作中,因此对于定位的精度还是有很大要求的,至少不能偏差太多。

    腾讯位置服务SDK集成

    Android下集成sdk

    技术选型为Android定位SDK室内服务

    1、解压sdk,先放jar包到libs

    image.png

    2、安放so 到 jniLibs

    image.png

    3、配置项目gradle配置和模块gradle配置

    google()
    jcenter()
     mavenCentral()
    

    image.png

    再修改模块gradle配置

    image.png

    dependencies {
        implementation fileTree(include: ['*.jar'], dir: 'libs')
    }
    

    4、给予App相应的权限
    修改AndroidManifest.xml文件

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.pms">
    
        <application
            android:name=".MyApplication"
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:networkSecurityConfig="@xml/network_security_config"
            android:supportsRtl="true"
            android:theme="@style/Theme.Pms">
            <activity
                android:name=".ui.login.LoginActivity"
                android:label="@string/title_activity_login">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity
                android:name=".MainActivity"
                android:label="@string/app_name">
    
            </activity>
            <meta-data android:name="TencentMapSDK" android:value="你的key,你的key,这个不配获取不了坐标位置" />
        </application>
    
    
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <!-- 通过GPS得到精确位置 -->
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
        <!-- 通过网络得到粗略位置 -->
        <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
        <!-- 访问网络. 某些位置信息需要从网络服务器获取 -->
        <uses-permission android:name="android.permission.INTERNET" />
        <!-- 访问WiFi状态. 需要WiFi信息用于网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
        <!-- 修改WiFi状态. 发起WiFi扫描, 需要WiFi信息用于网络定位 -->
        <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
        <!-- 访问网络状态, 检测网络的可用性. 需要网络运营商相关信息用于网络定位 -->
        <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
        <!-- 访问网络的变化, 需要某些信息用于网络定位 -->
        <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
        <!-- 访问手机当前状态, 需要device id用于网络定位 -->
        <uses-permission android:name="android.permission.READ_PHONE_STATE" />
        <!-- 支持A-GPS辅助定位 -->
        <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
        <!-- 用于 log 日志 -->
        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    </manifest>
    

    5、同步下项目

    点击Android Studio的文件菜单内的Sync Project With Gradle Files.

    6、自定义Application,在里面增加位置服务的初始化。

    package com.example.pms;
    
    import android.app.Application;
    
    import com.lzy.okgo.OkGo;
    import com.lzy.okgo.cache.CacheEntity;
    import com.lzy.okgo.cache.CacheMode;
    import com.lzy.okgo.https.HttpsUtils;
    import com.lzy.okgo.interceptor.HttpLoggingInterceptor;
    import com.lzy.okgo.model.HttpHeaders;
    import com.tencent.map.geolocation.TencentLocationManager;
    
    public class MyApplication  extends Application {
    
        public  static  MyApplication  app;
    
        public  static  MyApplication  getInstance(){
            return  app;
        }
    
        public TencentLocationManager mLocationManager;
    
        @Override
        public void onCreate() {
            super.onCreate();
            app = this;
            //初始化,easy的很~~~
            mLocationManager = TencentLocationManager.getInstance(this);
        }
    }
    
    

    7、连续定位开启
    放在了 MainActivity内

    
    import android.os.Bundle;
    import android.util.Log;
    
    import com.google.android.material.bottomnavigation.BottomNavigationView;
    import com.tencent.map.geolocation.TencentLocation;
    import com.tencent.map.geolocation.TencentLocationListener;
    import com.tencent.map.geolocation.TencentLocationRequest;
    
    //实现接口定义 TencentLocationListener 监控位置信息
    public class MainActivity extends AppCompatActivity implements TencentLocationListener {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);       
    
            //建立请求
            TencentLocationRequest request = TencentLocationRequest.create();
            //我们只需要经纬度和地址名称
            request. setRequestLevel(TencentLocationRequest. REQUEST_LEVEL_NAME);
            //允许使用GPS
            request.setAllowGPS(true);
            //需要开启室内定位
            request.setIndoorLocationMode(true);
            //请求连续定位,这里默认是10s间隔定时推送位置信息。
            MyApplication.getInstance().mLocationManager.requestLocationUpdates(request, this);
        }
    
        @Override
        public void onLocationChanged(TencentLocation location, int error, String reason) {
            // do your work
            String s = String.format("%s %s (%f %f %f)",location.getAddress(),location.getName(),location.getLatitude(),location.getLongitude(),location.getAltitude());
            Log.i("location",s);
        }
    
        @Override
        public void onStatusUpdate(String name, int status, String desc) {
            // do your work
        }
    
    }
    

    腾讯地图轨迹回放

    有了地址的支持,地图轨迹回放就非常容易了,腾讯提供了动态轨迹,可以参考如下代码。

    function initMap() {
                var center = new TMap.LatLng(39.984104, 116.307503);
    
                //初始化地图
                var map = new TMap.Map("container", {
                    zoom:12,//设置地图缩放级别
                    center: center,//设置地图中心点坐标
                    mapStyleId: "style1" //个性化样式
                });
                //初始化轨迹图并添加至map图层
                new TMap.visualization.Trail({
                    pickStyle:function(item){ //轨迹图样式映射函数
                        return {
                             2
                        }
                    },
                    startTime: 0,//动画循环周期的起始时间戳
                    showDuration: 120,//动画中轨迹点高亮的持续时间
                    playRate:30 // 动画播放倍速
    
                })
                .addTo(map)
                .setData(trailData);//设置数据
            }
        </script>
    

    image.png

    作者:webmote

    链接:https://webmote.blog.csdn.net/article/details/111352712

    来源:CSDN

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    倍增或线段树,给出一个数,让它模一连串的数
    江西财经大学第一届程序设计竞赛
    L2-027. 名人堂与代金券
    hdu 3038 给区间和,算出多少是错的
    cf166e 在四面体上寻找路线数 递推,取模
    cf946d 怎样逃最多的课dp
    PAM练习
    PAM模板
    E. Erase Subsequences dp
    CSU2004:Finding words(含指定不相交前后缀的模式串计数)
  • 原文地址:https://www.cnblogs.com/TencentLBS/p/14666409.html
Copyright © 2011-2022 走看看