闲聊
看过《鹰眼追击》这部电影的读者一定对“鹰眼”这台巨无霸计算机印象深刻,现在我们可以实现自己的鹰眼。
效果图
使用百度鹰眼轨迹SDK可以实现的功能
- 轨迹追踪
借助GPS、基站、Wi-Fi和传感器信息,实现室内、外高精度的连续轨迹追踪,整体定位精度50m:
- GPS:10m(取决于芯片)
- WIFI:27m
- 基站:27m
- 轨迹回传
采用TCP长连接、数据打包压缩、加密回传等策略,保障数据安全,实现超低流量损耗。 - 轨迹纠偏(全新上线)
- 去噪:去除定位漂移点;
- 绑路:依据百度道路数据,将偏移轨迹纠正至道路。
- 抽稀:去除重复冗余轨迹点,精简轨迹数据。
- 轨迹查询
- 查询被追踪者的实时位置;
- 查询被追踪者某时间段的历史轨迹。
- 实时里程计算。
- 地理围栏报警
地理围栏是指一定范围(圆形、多边形)的虚拟地理区域。当被追踪者进入、离开该区域时,监控者可以接收到自动报警通知。
- 云端监控围栏触发,主动推送报警;
- 历史报警信息查询;
其实说白了就一句话,可以追踪被跟踪者的轨迹。看到这里你是不是想到什么了呢。
用代码告诉你什么是追踪
- 创建应用获取密钥:http://lbsyun.baidu.com/apiconsole/key
- 创建鹰眼轨迹服务:http://lbsyun.baidu.com/index.php?title=android-yingyan/guide/createservice
- 配置示例:http://lbsyun.baidu.com/index.php?title=android-yingyan/guide/buildproject
- 结合百度鹰眼轨迹SDK实现我们自己的逻辑
怎么开始和关闭鹰眼轨迹追踪
private LBSTraceClient client;
private Trace trace;
/**
* 鹰眼服务ID
*/
private long serviceId = 112700L;
/**
* 地理围栏监听器
*/
private OnGeoFenceListener geoFenceListener;
/**
* 围栏ID
*/
private int fenceId;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
client = new LBSTraceClient(getApplicationContext());
}
/**
* 开始鹰眼轨迹追踪
*/
private void startTrace() {
String entityName = "test";
int traceType = 2;
trace = new Trace(getApplicationContext(), serviceId, entityName, traceType);
OnStartTraceListener startTraceListener = new OnStartTraceListener() {
@Override
public void onTraceCallback(int arg0, String arg1) {
Log.i(TAG, "onTraceCallback" + "arg0 = " + arg0 + " arg1 = " + arg1);
}
@Override
public void onTracePushCallback(byte arg0, String arg1) {
Log.i(TAG, "onTracePushCallback" + "arg0 = " + arg0 + " arg1 = " + arg1);
}
};
int gatherInterval = 10;
int packInterval = 60;
int protocoType = 0;
client.setInterval(gatherInterval, packInterval);
client.setProtocolType(protocoType);
client.startTrace(trace, startTraceListener);
}
/**
* 结束鹰眼轨迹追踪
*/
private void stopTrace() {
OnStopTraceListener stopTraceListener = new OnStopTraceListener() {
@Override
public void onStopTraceSuccess() {
Log.i(TAG, "onStopTraceSuccess");
}
@Override
public void onStopTraceFailed(int arg0, String arg1) {
Log.i(TAG, "onStopTraceFailed" + "arg0 = " + arg0 + " arg1 = " + arg1);
}
};
client.stopTrace(trace, stopTraceListener);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
如此我们便有了最简单的鹰眼追踪。在后台就可以看见运行APP的具体位置。是不是觉得有些神奇呢,接下来还有更好玩的。
/**
* 鹰眼查询实时位置
*/
private void findLocationAtTime() {
String entityNames = "test";
String columnKey = "";
int returnType = 0;
int activeTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
int pageSize = 1000;
int pageIndex = 1;
OnEntityListener entityListener = new OnEntityListener() {
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "onRequestFailedCallback" + "arg0 = " + arg0);
}
@Override
public void onQueryEntityListCallback(String arg0) {
Log.i(TAG, "onQueryEntityListCallback" + " arg0 = " + arg0);
}
};
client.queryEntityList(serviceId, entityNames, columnKey, returnType, activeTime, pageSize,
pageIndex, entityListener);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
调用这么一个代码段之后,我们可以实现在手机端查看被追踪者的实时位置。还有这么一种情况,跑步类的APP他们是怎么绘制出跑步轨迹的呢。接下来就是见证奇迹的时刻!
/**
* 鹰眼查询历史轨迹
*/
private void findLocationOnHistory() {
String entityName = "test";
int simpleReturn = 1;
int startTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
int endTime = (int) (System.currentTimeMillis() / 1000);
int pageSize = 1000;
int pageIndex = 1;
OnTrackListener trackListener = new OnTrackListener() {
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "onRequestFailedCallback" + "arg0 = " + arg0);
}
@Override
public void onQueryHistoryTrackCallback(String arg0) {
Log.i(TAG, "onQueryHistoryTrackCallback" + "arg0 = " + arg0);
}
};
client.queryHistoryTrack(serviceId, entityName, simpleReturn, startTime, endTime,
pageSize, pageIndex, trackListener);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
铛铛铛!历史轨迹查询,可以查询某段事件之内的历史轨迹。再结合Android 百度地图周边雷达(v3.7.0)及覆盖物,绘制出路线即可实现“跑步轨迹”。
假设有这么一种需求,被追踪者进入某片区域时我们要能够及时知道。百度鹰眼轨迹SDK给我们提供了这种方法。地理围栏。用围栏把被追踪者“围”起来怎么样?被追踪者进入,我们可以收到通知。哈哈
既然用到地理围栏,那么肯定要创建一个围栏啦!在本Demo在onCreate中就创建了一个围栏。具体如下
/**
* 创建围栏
*/
private void createFence() {
geoFenceListener = new OnGeoFenceListener() {
@Override
public void onRequestFailedCallback(String arg0) {
Log.i(TAG, "geoFence请求失败 :" + "arg0 = " + arg0);
}
@Override
public void onCreateCircularFenceCallback(String arg0) {
Log.i(TAG, "创建圆形围栏回调接口消息 : " + "arg0 = " + arg0);
JSONObject dataJson = null;
try {
dataJson = new JSONObject(arg0);
int status = dataJson.getInt("status");
if (0 == status) {
fenceId = dataJson.getInt("fence_id");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
@Override
public void onUpdateCircularFenceCallback(String arg0) {
Log.i(TAG, "更新圆形围栏回调接口消息 :" + "arg0 = " + arg0);
}
@Override
public void onDelayAlarmCallback(String arg0) {
Log.i(TAG, "延迟报警回调接口消息 :" + "arg0 = " + arg0);
}
@Override
public void onDeleteFenceCallback(String arg0) {
Log.i(TAG, "删除围栏回调接口消息 :" + "arg0 = " + arg0);
}
@Override
public void onQueryFenceListCallback(String arg0) {
Log.i(TAG, "查询围栏列表回调接口消息 : " + "arg0 = " + arg0);
}
@Override
public void onQueryHistoryAlarmCallback(String arg0) {
Log.i(TAG, "查询历史报警回调接口消息 : " + "arg0 = " + arg0);
}
@Override
public void onQueryMonitoredStatusCallback(String arg0) {
Log.i(TAG, "查询监控对象状态回调接口消息 : " + "arg0 = " + arg0);
}
};
String creator = "test";
String fenceName = "school";
String fenceDesc = "学校";
String monitoredPersons = "test";
String observers = "test";
String validTimes = "";
int validCycle = 4;
String validDate = "";
String validDays = "";
int coordType = 3;
String center = "120.2126083541,30.245619808604";
double radius = 500;
int alarmCondition = 3;
client.createCircularFence(serviceId, creator, fenceName, fenceDesc, monitoredPersons,
observers,validTimes, validCycle, validDate, validDays, coordType, center, radius,
alarmCondition, geoFenceListener);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
这里有个坑我到现在都没爬出来:int validCycle = 4;百度文档里validCycle =5 跑步起来仿照Demo中改为4就可以了,希望明白这个字段意义的同学能私信我。
代码段有些长,但是逻辑还是很清楚的。相信聪明的你一定可以看懂。注意:SDK中地理围栏接口都是异步调用,需要实例化监听器来获取调用结果。围栏都创建好了,就看猎物进不进了。
/** 围栏查询实时状态 */
private void findFenceAtTime() {
if (fenceId != 0) {
String monitoredPersons = "test";
client.queryMonitoredStatus(serviceId, fenceId, monitoredPersons, geoFenceListener);
}
}
/** 围栏历史报警信息 */
private void findFenceOnHistory() {
if (fenceId != 0) {
String monitoredPersons = "test";
int beginTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);
int endTime = (int) (System.currentTimeMillis() / 1000);
client.queryFenceHistoryAlarmInfo(serviceId, fenceId, monitoredPersons, beginTime, endTime,
geoFenceListener);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
这里列出来两种围栏状态查询。一种是实时查询还一个是历史报警信息查询,注释很多就不啰嗦了。
至此,百度鹰眼轨迹SDK所有功能都展示一遍。