Android 百度鹰眼轨迹SDK(v2.1.6)
来源:互联网 发布:如何卸载mac上的app 编辑:程序博客网 时间:2024/05/22 01:37
闲聊
看过《鹰眼追击》这部电影的读者一定对“鹰眼”这台巨无霸计算机印象深刻,现在我们可以实现自己的鹰眼。
效果图
本篇为百度地图SDK第三篇博文
第一篇实现:Android 百度地图周边雷达(v6.1.3)及覆盖物
第二篇实现:Android 百度定位SDK(v6.1.3)结合方向传感器
本博文为第三篇
使用百度鹰眼轨迹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); //在使用SDK各组件之前初始化context信息,传入ApplicationContext //注意该方法要再setContentView方法之前实现 SDKInitializer.initialize(getApplicationContext()); setContentView(R.layout.activity_main); // 实例化轨迹服务客户端 client = new LBSTraceClient(getApplicationContext()); } /** * 开始鹰眼轨迹追踪 */ private void startTrace() { // entity标识(监听后台显示的名字) String entityName = "test"; // 轨迹服务类型(0 : 不上传位置数据,也不接收报警信息; 1 : 不上传位置数据,但接收报警信息; // 2 : 上传位置数据,且接收报警信息) int traceType = 2; //实例化轨迹服务 trace = new Trace(getApplicationContext(), serviceId, entityName, traceType); // 实例化开启轨迹服务回调接口 OnStartTraceListener startTraceListener = new OnStartTraceListener() { // 开启轨迹服务回调接口(arg0 : 消息编码,arg1 : 消息内容,详情查看类参考) @Override public void onTraceCallback(int arg0, String arg1) { Log.i(TAG, "onTraceCallback" + "arg0 = " + arg0 + " arg1 = " + arg1); } // 轨迹服务推送接口(用于接收服务端推送消息,arg0 : 消息类型,arg1 : 消息内容,详情查看类参考) @Override public void onTracePushCallback(byte arg0, String arg1) { Log.i(TAG, "onTracePushCallback" + "arg0 = " + arg0 + " arg1 = " + arg1); } }; // 位置采集周期 int gatherInterval = 10; // 打包周期 int packInterval = 60; // 设置协议类型,0为http,1为https 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"); } // 轨迹服务停止失败(arg0 : 错误编码,arg1 : 消息内容,详情查看类参考) @Override public void onStopTraceFailed(int arg0, String arg1) { Log.i(TAG, "onStopTraceFailed" + "arg0 = " + arg0 + " arg1 = " + arg1); } }; //停止轨迹服务 client.stopTrace(trace, stopTraceListener); }
如此我们便有了最简单的鹰眼追踪。在后台就可以看见运行APP的具体位置。是不是觉得有些神奇呢,接下来还有更好玩的。
/** * 鹰眼查询实时位置 */ private void findLocationAtTime() { //entity标识列表(多个entityName,以英文逗号"," 分割) String entityNames = "test"; //检索条件(格式为 : "key1=value1,key2=value2,.....") String columnKey = ""; //返回结果的类型(0 : 返回全部结果,1 : 只返回entityName的列表) int returnType = 0; //活跃时间,UNIX时间戳(指定该字段时,返回从该时间点之后仍有位置变动的entity的实时点集合) int activeTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60); //分页大小 int pageSize = 1000; //分页索引 int pageIndex = 1; //Entity监听器 OnEntityListener entityListener = new OnEntityListener() { // 查询失败回调接口 @Override public void onRequestFailedCallback(String arg0) { Log.i(TAG, "onRequestFailedCallback" + "arg0 = " + arg0); } // 查询entity回调接口,返回查询结果列表 @Override public void onQueryEntityListCallback(String arg0) { Log.i(TAG, "onQueryEntityListCallback" + " arg0 = " + arg0); } }; //查询实时轨迹 client.queryEntityList(serviceId, entityNames, columnKey, returnType, activeTime, pageSize, pageIndex, entityListener); }
调用这么一个代码段之后,我们可以实现在手机端查看被追踪者的实时位置。还有这么一种情况,跑步类的APP他们是怎么绘制出跑步轨迹的呢。接下来就是见证奇迹的时刻!
/** * 鹰眼查询历史轨迹 */ private void findLocationOnHistory() { //entity标识 String entityName = "test"; //是否返回精简的结果(0 : 将只返回经纬度,1 : 将返回经纬度及其他属性信息) int simpleReturn = 1; //开始时间(Unix时间戳) int startTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60); //结束时间(Unix时间戳) 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); }
铛铛铛!历史轨迹查询,可以查询某段事件之内的历史轨迹。再结合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); } }; //创建者(entity标识) String creator = "test"; //围栏名称 String fenceName = "school"; //围栏描述 String fenceDesc = "学校"; //监控对象列表(多个entityName,以英文逗号"," 分割) String monitoredPersons = "test"; //观察者列表(多个entityName,以英文逗号"," 分割) String observers = "test"; //生效时间列表 String validTimes = ""; //生效周期 int validCycle = 4; //围栏生效日期 String validDate = ""; //生效日期列表 String validDays = ""; //坐标类型 (1:GPS经纬度,2:国测局经纬度,3:百度经纬度) int coordType = 3; //围栏圆心(圆心位置, 格式 : "经度,纬度") String center = "120.2126083541,30.245619808604"; //围栏半径(单位 : 米) double radius = 500; //报警条件(1:进入时触发提醒,2:离开时触发提醒,3:进入离开均触发提醒) int alarmCondition = 3; //创建圆形地理围栏 client.createCircularFence(serviceId, creator, fenceName, fenceDesc, monitoredPersons, observers,validTimes, validCycle, validDate, validDays, coordType, center, radius, alarmCondition, geoFenceListener); }
这里有个坑我到现在都没爬出来:int validCycle = 4;百度文档里validCycle =5 跑步起来仿照Demo中改为4就可以了,希望明白这个字段意义的同学能私信我。
代码段有些长,但是逻辑还是很清楚的。相信聪明的你一定可以看懂。注意:SDK中地理围栏接口都是异步调用,需要实例化监听器来获取调用结果。围栏都创建好了,就看猎物进不进了。
/** 围栏查询实时状态 */ private void findFenceAtTime() { if (fenceId != 0) { //监控对象列表(多个entityName,以英文逗号"," 分割) String monitoredPersons = "test"; //查询实时状态 client.queryMonitoredStatus(serviceId, fenceId, monitoredPersons, geoFenceListener); } } /** 围栏历史报警信息 */ private void findFenceOnHistory() { if (fenceId != 0) { //监控对象列表(多个entityName,以英文逗号"," 分割) String monitoredPersons = "test"; //开始时间(unix时间戳) int beginTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60); //结束时间(unix时间戳) int endTime = (int) (System.currentTimeMillis() / 1000); //查询历史报警信息 client.queryFenceHistoryAlarmInfo(serviceId, fenceId, monitoredPersons, beginTime, endTime, geoFenceListener); } }
这里列出来两种围栏状态查询。一种是实时查询还一个是历史报警信息查询,注释很多就不啰嗦了。
至此,百度鹰眼轨迹SDK所有功能都展示一遍。
欢迎访问我的博客及另外两篇关于百度地图SDK的博文,综合使用可以实现更多效果:
我的博客
Android 百度地图周边雷达(v6.1.3)及覆盖物
Android 百度定位SDK(v6.1.3)结合方向传感器
Demo全部代码及资源下载:http://download.csdn.net/detail/qq_17250009/9469613
- Android 百度鹰眼轨迹SDK(v2.1.6)
- Android 百度鹰眼轨迹SDK(v2.1.6)
- Android百度鹰眼轨迹
- 百度鹰眼轨迹iOS SDK
- Android-百度地图鹰眼轨迹SDK使用全解析
- 第三方SDK:百度地图(二)定位 + 鹰眼轨迹
- 百度鹰眼Android SDK 运行配置
- Android 使用百度鹰眼实现运动轨迹功能
- Android 使用百度鹰眼实现运动轨迹功能
- Android 使用百度鹰眼实现运动轨迹功能
- iOS开发(第三方使用)——百度地图鹰眼轨迹SDK接入
- Android百度地图(四):百度地图运动轨迹纠偏、去噪、绑路之百度鹰眼
- Android百度地图(四):百度地图运动轨迹纠偏、去噪、绑路之百度鹰眼
- 百度地图鹰眼轨迹---乱码问题
- 百度鹰眼,开始记录轨迹崩溃
- javaweb百度鹰眼上传轨迹接口
- android 百度导航引擎初始化失败找不到libgnustl_shared.so以及百度鹰眼轨迹异常的问题
- 第三方SDK:百度鹰眼
- android 调试进阶
- leetcode--242-- Valid Anagram
- Latex设置图片等资源文件和.bib 文件以及输出文件与 .tex文件不在同一目录
- DataBinding
- JS 学习笔记
- Android 百度鹰眼轨迹SDK(v2.1.6)
- Java中自定义Exception异常
- 代码自动生成-宏递归思想
- 找工作——jvm复习(二)
- EvenBus3.0中文翻译(二)Priorities and Event Cancellation
- LeetCode 15 3Sum(尺取法或哈希)
- C++作业2
- YII通过db执行sql语句可以看下面
- leetcode——326——Power of Three