基于騰訊地圖定位實(shí)現(xiàn)物業(yè)巡檢防作弊場(chǎng)景

前言

在物業(yè)管理中,小區(qū)內(nèi)人員巡檢還是非常常見(jiàn)的工作之一,為了降低物業(yè)的投入,設(shè)計(jì)了采用掃描二維碼的形式輔助系統(tǒng)檢測(cè)每個(gè)員工巡檢的位置,以便進(jìn)行常規(guī)的物業(yè)巡檢工作。雖然二維碼既便宜又易用,然而由于其可拍照和被動(dòng)的模式,會(huì)導(dǎo)致作弊的問(wèn)題,因此在常規(guī)的掃碼中,需要增加定位功能以便輔助系統(tǒng)鑒別作弊行為。

系統(tǒng)的方案設(shè)計(jì)

巡檢任務(wù)按照端的不同,分為兩部分,一部分在App內(nèi)實(shí)現(xiàn),一部分在PC后臺(tái)實(shí)現(xiàn),其分工大抵如下:

  • PC端: 對(duì)巡檢任務(wù)進(jìn)行定義并分派,不同的人員分派不同的巡檢任務(wù)。當(dāng)人員通過(guò)app進(jìn)行巡檢后,后臺(tái)可以查詢?nèi)蝿?wù)的完成情況,通過(guò)二維碼確定每個(gè)巡檢點(diǎn)都巡檢過(guò),通過(guò)人員的位置歷史對(duì)巡檢任務(wù)的人員軌跡進(jìn)行回放。因?yàn)闆](méi)有引入電子圍欄,所以只能按照軌跡人工判斷是否作弊。不過(guò)本身防止作弊的問(wèn)題就是一種威懾,因此效果并不會(huì)太差。

  • App端:人員通過(guò)App進(jìn)行登錄,登錄后獲取自己的巡檢任務(wù),按照巡檢的指示,對(duì)各個(gè)巡檢點(diǎn)進(jìn)行掃碼打卡。app在打開(kāi)后開(kāi)啟連續(xù)定位,并按照一定的速率定時(shí)上傳到位置庫(kù)。

image.png

由于是應(yīng)用在小區(qū)的巡檢工作中,因此對(duì)于定位的精度還是有很大要求的,至少不能偏差太多。

騰訊位置服務(wù)SDK集成

Android下集成sdk

技術(shù)選型

Android定位SDK

室內(nèi)服務(wù)

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

image.png

2、安放so 到 jniLibs

image.png

3、配置項(xiàng)目gradle配置和模塊gradle配置

google()
jcenter()
 mavenCentral()
image.png

再修改模塊gradle配置

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

4、給予App相應(yīng)的權(quán)限
修改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,這個(gè)不配獲取不了坐標(biāo)位置" />
    </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"/>
    <!-- 通過(guò)GPS得到精確位置 -->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
    <!-- 通過(guò)網(wǎng)絡(luò)得到粗略位置 -->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
    <!-- 訪問(wèn)網(wǎng)絡(luò). 某些位置信息需要從網(wǎng)絡(luò)服務(wù)器獲取 -->
    <uses-permission android:name="android.permission.INTERNET" />
    <!-- 訪問(wèn)WiFi狀態(tài). 需要WiFi信息用于網(wǎng)絡(luò)定位 -->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    <!-- 修改WiFi狀態(tài). 發(fā)起WiFi掃描, 需要WiFi信息用于網(wǎng)絡(luò)定位 -->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
    <!-- 訪問(wèn)網(wǎng)絡(luò)狀態(tài), 檢測(cè)網(wǎng)絡(luò)的可用性. 需要網(wǎng)絡(luò)運(yùn)營(yíng)商相關(guān)信息用于網(wǎng)絡(luò)定位 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
    <!-- 訪問(wèn)網(wǎng)絡(luò)的變化, 需要某些信息用于網(wǎng)絡(luò)定位 -->
    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
    <!-- 訪問(wèn)手機(jī)當(dāng)前狀態(tài), 需要device id用于網(wǎng)絡(luò)定位 -->
    <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、同步下項(xiàng)目

點(diǎn)擊Android Studio的文件菜單內(nèi)的Sync Project With Gradle Files.

6、自定義Application,在里面增加位置服務(wù)的初始化。

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、連續(xù)定位開(kāi)啟
放在了 MainActivity內(nèi)


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;

//實(shí)現(xiàn)接口定義 TencentLocationListener 監(jiān)控位置信息
public class MainActivity extends AppCompatActivity implements TencentLocationListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);       

        //建立請(qǐng)求
        TencentLocationRequest request = TencentLocationRequest.create();
        //我們只需要經(jīng)緯度和地址名稱
        request. setRequestLevel(TencentLocationRequest. REQUEST_LEVEL_NAME);
        //允許使用GPS
        request.setAllowGPS(true);
        //需要開(kāi)啟室內(nèi)定位
        request.setIndoorLocationMode(true);
        //請(qǐng)求連續(xù)定位,這里默認(rèn)是10s間隔定時(shí)推送位置信息。
        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
    }

}

騰訊地圖軌跡回放

有了地址的支持,地圖軌跡回放就非常容易了,騰訊提供了動(dòng)態(tài)軌跡,可以參考如下代碼。

function initMap() {
            var center = new TMap.LatLng(39.984104, 116.307503);

            //初始化地圖
            var map = new TMap.Map("container", {
                zoom:12,//設(shè)置地圖縮放級(jí)別
                center: center,//設(shè)置地圖中心點(diǎn)坐標(biāo)
                mapStyleId: "style1" //個(gè)性化樣式
            });
            //初始化軌跡圖并添加至map圖層
            new TMap.visualization.Trail({
                pickStyle:function(item){ //軌跡圖樣式映射函數(shù)
                    return {
                        width: 2
                    }
                },
                startTime: 0,//動(dòng)畫(huà)循環(huán)周期的起始時(shí)間戳
                showDuration: 120,//動(dòng)畫(huà)中軌跡點(diǎn)高亮的持續(xù)時(shí)間
                playRate:30 // 動(dòng)畫(huà)播放倍速

            })
            .addTo(map)
            .setData(trailData);//設(shè)置數(shù)據(jù)
        }
    </script>
image.png

作者:webmote

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

來(lái)源:CSDN

著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請(qǐng)聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請(qǐng)注明出處。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容