前言
在物业管理中,小区内人员巡检还是十分常见的工作之一,为了升高物业的投入,设计了采纳扫描二维码的模式辅助零碎检测每个员工巡检的地位,以便进行惯例的物业巡检工作。尽管二维码既便宜又易用,然而因为其可拍照和被动的模式,会导致舞弊的问题,因而在惯例的扫码中,须要减少定位性能以便辅助零碎甄别舞弊行为。
零碎的方案设计
巡检工作依照端的不同,分为两局部,一部分在 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…
起源:CSDN
著作权归作者所有。商业转载请分割作者取得受权,非商业转载请注明出处。