前言
在物業管理中,小區內人員巡檢還是非常常見的工作之一,爲了降低物業的投入,設計了採用掃描二維碼的形式輔助系統檢測每個員工巡檢的位置,以便進行常規的物業巡檢工作。雖然二維碼既便宜又易用,然而由於其可拍照和被動的模式,會導致作弊的問題,因此在常規的掃碼中,需要增加定位功能以便輔助系統鑑別作弊行爲。
系統的方案設計
巡檢任務按照端的不同,分爲兩部分,一部分在App內實現,一部分在PC後臺實現,其分工大抵如下:
-
PC端: 對巡檢任務進行定義並分派,不同的人員分派不同的巡檢任務。當人員通過app進行巡檢後,後臺可以查詢任務的完成情況,通過二維碼確定每個巡檢點都巡檢過,通過人員的位置歷史對巡檢任務的人員軌跡進行回放。因爲沒有引入電子圍欄,所以只能按照軌跡人工判斷是否作弊。不過本身防止作弊的問題就是一種威懾,因此效果並不會太差。
-
App端:人員通過App進行登錄,登錄後獲取自己的巡檢任務,按照巡檢的指示,對各個巡檢點進行掃碼打卡。app在打開後開啓連續定位,並按照一定的速率定時上傳到位置庫。
由於是應用在小區的巡檢工作中,因此對於定位的精度還是有很大要求的,至少不能偏差太多。
騰訊位置服務SDK集成
Android下集成sdk
技術選型爲Android定位SDK和室內服務
1、解壓sdk,先放jar包到libs
2、安放so 到 jniLibs
3、配置項目gradle配置和模塊gradle配置
google()
jcenter()
mavenCentral()
再修改模塊gradle配置
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 {
width: 2
}
},
startTime: 0,//動畫循環週期的起始時間戳
showDuration: 120,//動畫中軌跡點高亮的持續時間
playRate:30 // 動畫播放倍速
})
.addTo(map)
.setData(trailData);//設置數據
}
</script>
作者:webmote
鏈接:https://webmote.blog.csdn.net/article/details/111352712
來源:CSDN
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。