闲聊

看过《鹰眼追击》这部电影的读者一定对“鹰眼”这台巨无霸计算机印象深刻,如今我们能够实现自己的鹰眼。

效果图

本篇为百度地图SDK第三篇博文

第一篇实现:Android 百度地图周边雷达(v6.1.3)及覆盖物

第二篇实现:Android 百度定位SDK(v6.1.3)结合方向传感器

本博文为第三篇

使用百度鹰眼轨迹SDK能够实现的功能

  1. 轨迹追踪

    借助GPS、基站、Wi-Fi和传感器信息,实现室内、外高精度的连续轨迹追踪。总体定位精度50m:

    • GPS:10m(取决于芯片)
    • WIFI:27m
    • 基站:27m
  2. 轨迹回传

    採用TCP长连接、数据打包压缩、加密回传等策略,保障数据安全,实现超低流量损耗。
  3. 轨迹纠偏(全新上线)
    • 去噪:去除定位漂移点。
    • 绑路:根据百度道路数据。将偏移轨迹纠正至道路。

    • 抽稀:去除反复冗余轨迹点。精简轨迹数据。
  4. 轨迹查询
    • 查询被追踪者的实时位置;
    • 查询被追踪者某时间段的历史轨迹。

    • 实时里程计算。
  5. 地理围栏报警

    地理围栏是指一定范围(圆形、多边形)的虚拟地理区域。

    当被追踪者进入、离开该区域时,监控者能够接收到自己主动报警通知。

    • 云端监控围栏触发,主动推送报警;
    • 历史报警信息查询。

事实上说白了就一句话。能够追踪被跟踪者的轨迹。看到这里你是不是想到什么了呢。


用代码告诉你什么是追踪

  1. 创建应用获取密钥:http://lbsyun.baidu.com/apiconsole/key
  2. 创建鹰眼轨迹服务:http://lbsyun.baidu.com/index.php?title=android-yingyan/guide/createservice
  3. 配置演示样例:

    title=android-yingyan/guide/buildproject">http://lbsyun.baidu.com/index.php?

    title=android-yingyan/guide/buildproject

  4. 结合百度鹰眼轨迹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的博文,综合使用能够实现很多其它效果:

  1. 我的博客

  2. Android 百度地图周边雷达(v6.1.3)及覆盖物

  3. Android 百度定位SDK(v6.1.3)结合方向传感器

Demo所有代码及资源下载:http://download.csdn.net/detail/qq_17250009/9469613

Android 百度鹰眼轨迹SDK(v2.1.6)的更多相关文章

  1. 我的Android进阶之旅------>Android百度地图定位SDK功能学习

    因为项目需求,需要使用百度地图的定位功能,因此去百度地图开发平台下载了百度地图的Android定位SDK最新版本的开发包和示例代码学习. Android 定位SDK地址:http://develope ...

  2. android 百度最新地图sdk包怎么去除 放大缩小按钮

    // 隐藏缩放控件 int childCount = mMapView.getChildCount(); View zoom = null; ; i < childCount; i++) { V ...

  3. Android接入百度自动更新SDK

    一:前言 公司的app,上传到百度应用市场,然后说必须要接入百度的自动更新sdk才能上架,于是从百度官网上去下载jar包,下载的时候必须要带上数据统计,如果使用自动的jar包,还需要带上广告联盟,坑爹 ...

  4. 【百度地图-安卓SDK】从头开始写android程序

    [百度地图-安卓SDK]从头开始写android程序首先确保有这四个文件    安装jdk先安装android开发SDK(并不只是为eclipse服务的),即运行installer_r15-windo ...

  5. Gprinter Android SDK V2.1.4 使用说明

    佳博打印机Android的SDK开发包,已更新到Gprinter Android SDK V2.1.4. IOS的SDK开发包更新为GprinterSDKandDemoforIOS_v1.0.8. 根 ...

  6. Android 百度地图 SDK v3.0.0 (四) 引入离线地图功能

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37758097 一直觉得地图应用支持离线地图很重要啊,我等移动2G屌丝,流量不易, ...

  7. Android 百度地图 SDK v3.0.0 (三) 添加覆盖物Marker与InfoWindow的使用

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

  8. Android 百度地图 SDK v3.0.0 (一)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/37729091 最近公司要把百度地图集成的项目中,于是我就研究了一天百度地图的SD ...

  9. Android 百度地图 SDK v3.0.0 (三) 加入覆盖Marker与InfoWindow使用

    转载请注明出处:http://blog.csdn.net/lmj623565791/article/details/37737213 上篇博客已经实现了地图的定位以及结合了方向传感器用户路痴定位方向, ...

随机推荐

  1. ProDinner

    ylbtech-dbs:ProDinner A, 数据库关系图 返回顶部 4, 点餐关系图 3, 留言图 1, 用户角色关系图 0, B,SQL脚本返回顶部 2, use master go --ki ...

  2. 第二十五章 springboot + hystrixdashboard

    注意: hystrix基本使用:第十九章 springboot + hystrix(1) hystrix计数原理:附6 hystrix metrics and monitor 一.hystrixdas ...

  3. 第二章 Base64与URLBase64

    2.1.算法基本规则: 加密的算法公开 加密的密钥不公开 Base64算法公开.密钥也公开的特性不符合基本算法规则,所以很容易被破解,所以一般不用于企业级的加密操作. 注意:具体的算法与密钥(对于Ba ...

  4. webpack打包器简单入门

    概念 webpack是一个现代javascript应用程序的模块打包器. 当webpack处理你的应用程序时,它会递归构建一个依赖图(包含了你的应用程序所需要每个模块),然后把这些模块打包到少数几个b ...

  5. 用Telnet测试服务器的端口是否开通

      可以用telnet测试远程服务器的端口是否开通,格式如下: telnet <server name> <port number> 例如: Telnet tserv 3389 ...

  6. discuz上传头像失败怎么解决

    刚安装好的discuz程序,可能需要我们做许多修改,而头像上传失败则是最为常见的问题之一,那么discuz上传头像失败怎么解决呢 进入ftp,打开跟目录下config文件 下载"config ...

  7. Express application generator的使用

    首先拷贝express官网的一篇文章: (http://expressjs.com/en/starter/generator.html ) Express application generator ...

  8. PostgreSQL入门教程

    一.安装 首先,安装PostgreSQL客户端. sudo apt-get install postgresql-client 然后,安装PostgreSQL服务器. sudo apt-get ins ...

  9. 关于ZedGraph几个难点

    1.引言 由于工作原因,需要对数据进行图表展示,.NET默认的控件库或者DotNetBar的控件库又不能满足需求.去网上找到了这个开源的ZedGraph绘制2D图表的程序集,之所以选择这个ZedGra ...

  10. [Javascript] Check both prop exists and value is valid

    Sometime you need to check one prop exists on the object and value should not be ´null´ or ´undefine ...