zoukankan      html  css  js  c++  java
  • Android 百度鹰眼轨迹SDK(v2.1.6)

    闲聊

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

    效果图

    效果图

    本篇为百度地图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. 配置演示样例: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

  • 相关阅读:
    VMWare虚拟机下为Ubuntu 12.04.1配置静态IP(NAT方式)
    VMWare虚拟机下为Windows Server 2012配置静态IP(NAT方式)
    Windows 7防火墙阻止了远程桌面连接的解决方法
    Win10系统如何在防火墙里开放端口
    ECharts 定制 label 样式
    目标值柱状图
    echarts中datazoom相关配置
    环形图
    带时间轴的指标监控柱状图
    2020mysql面试题
  • 原文地址:https://www.cnblogs.com/gavanwanggw/p/7389265.html
Copyright © 2011-2022 走看看