Android 百度鹰眼轨迹SDK(v2.1.6)
閑聊
看過《鷹眼追擊》這部電影的讀者一定對“鷹眼”這臺巨無霸計算機(jī)印象深刻,如今我們能夠?qū)崿F(xiàn)自己的鷹眼。
效果圖
本篇為百度地圖SDK第三篇博文
第一篇實現(xiàn):Android 百度地圖周邊雷達(dá)(v6.1.3)及覆蓋物
第二篇實現(xiàn):Android 百度定位SDK(v6.1.3)結(jié)合方向傳感器
本博文為第三篇
使用百度鷹眼軌跡SDK能夠?qū)崿F(xiàn)的功能
借助GPS、基站、Wi-Fi和傳感器信息,實現(xiàn)室內(nèi)、外高精度的連續(xù)軌跡追蹤。總體定位精度50m:
- GPS:10m(取決于芯片)
- WIFI:27m
- 基站:27m
採用TCP長連接、數(shù)據(jù)打包壓縮、加密回傳等策略,保障數(shù)據(jù)安全,實現(xiàn)超低流量損耗。
- 去噪:去除定位漂移點。
- 綁路:根據(jù)百度道路數(shù)據(jù)。將偏移軌跡糾正至道路。
- 抽稀:去除反復(fù)冗余軌跡點。精簡軌跡數(shù)據(jù)。
- 查詢被追蹤者的實時位置;
- 查詢被追蹤者某時間段的歷史軌跡。
- 實時里程計算。
地理圍欄是指一定范圍(圓形、多邊形)的虛擬地理區(qū)域。
當(dāng)被追蹤者進(jìn)入、離開該區(qū)域時,監(jiān)控者能夠接收到自己主動報警通知。
- 云端監(jiān)控圍欄觸發(fā),主動推送報警;
- 歷史報警信息查詢。
事實上說白了就一句話。能夠追蹤被跟蹤者的軌跡。看到這里你是不是想到什么了呢。
用代碼告訴你什么是追蹤
title=android-yingyan/guide/buildproject
怎么開始和關(guān)閉鷹眼軌跡追蹤
//鷹眼軌跡相關(guān)private LBSTraceClient client;private Trace trace;/*** 鷹眼服務(wù)ID*/private long serviceId = 112700L;/*** 地理圍欄監(jiān)聽器*/private OnGeoFenceListener geoFenceListener;/*** 圍欄ID*/private int fenceId;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);//在使用SDK各組件之前初始化context信息,傳入ApplicationContext//注意該方法要再setContentView方法之前實現(xiàn)SDKInitializer.initialize(getApplicationContext());setContentView(R.layout.activity_main);// 實例化軌跡服務(wù)客戶端client = new LBSTraceClient(getApplicationContext());}/*** 開始鷹眼軌跡追蹤*/private void startTrace() {// entity標(biāo)識(監(jiān)聽后臺顯示的名字)String entityName = "test";// 軌跡服務(wù)類型(0 : 不上傳位置數(shù)據(jù)。也不接收報警信息; 1 : 不上傳位置數(shù)據(jù),但接收報警信息;// 2 : 上傳位置數(shù)據(jù),且接收報警信息)int traceType = 2;//實例化軌跡服務(wù)trace = new Trace(getApplicationContext(), serviceId, entityName, traceType);// 實例化開啟軌跡服務(wù)回調(diào)接口OnStartTraceListener startTraceListener = new OnStartTraceListener() {// 開啟軌跡服務(wù)回調(diào)接口(arg0 : 消息編碼,arg1 : 消息內(nèi)容,詳情查看類參考)@Overridepublic void onTraceCallback(int arg0, String arg1) {Log.i(TAG, "onTraceCallback" + "arg0 = " + arg0 + " arg1 = " + arg1);}// 軌跡服務(wù)推送接口(用于接收服務(wù)端推送消息。arg0 : 消息類型。arg1 : 消息內(nèi)容,詳情查看類參考)@Overridepublic void onTracePushCallback(byte arg0, String arg1) {Log.i(TAG, "onTracePushCallback" + "arg0 = " + arg0 + " arg1 = " + arg1);}};// 位置採集周期int gatherInterval = 10;// 打包周期int packInterval = 60;// 設(shè)置協(xié)議類型,0為http,1為httpsint protocoType = 0;// 設(shè)置位置採集和打包周期client.setInterval(gatherInterval, packInterval);// 設(shè)置協(xié)議client.setProtocolType(protocoType);// 開啟軌跡服務(wù)client.startTrace(trace, startTraceListener);}/*** 結(jié)束鷹眼軌跡追蹤*/private void stopTrace() {// 實例化停止軌跡服務(wù)回調(diào)接口OnStopTraceListener stopTraceListener = new OnStopTraceListener() {// 軌跡服務(wù)停止成功@Overridepublic void onStopTraceSuccess() {Log.i(TAG, "onStopTraceSuccess");}// 軌跡服務(wù)停止失敗(arg0 : 錯誤編碼。arg1 : 消息內(nèi)容,詳情查看類參考)@Overridepublic void onStopTraceFailed(int arg0, String arg1) {Log.i(TAG, "onStopTraceFailed" + "arg0 = " + arg0 + " arg1 = " + arg1);}};//停止軌跡服務(wù)client.stopTrace(trace, stopTraceListener);}如此我們便有了最簡單的鷹眼追蹤。在后臺就能夠看見執(zhí)行APP的詳細(xì)位置。是不是認(rèn)為有些奇妙呢,接下來還有更好玩的。
/*** 鷹眼查詢實時位置*/private void findLocationAtTime() {//entity標(biāo)識列表(多個entityName。以英文逗號"," 切割)String entityNames = "test";//檢索條件(格式為 : "key1=value1,key2=value2,.....")String columnKey = "";//返回結(jié)果的類型(0 : 返回所有結(jié)果。1 : 僅僅返回entityName的列表)int returnType = 0;//活躍時間,UNIX時間戳(指定該字段時,返回從該時間點之后仍有位置變動的entity的實時點集合)int activeTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);//分頁大小int pageSize = 1000;//分頁索引int pageIndex = 1;//Entity監(jiān)聽器OnEntityListener entityListener = new OnEntityListener() {// 查詢失敗回調(diào)接口@Overridepublic void onRequestFailedCallback(String arg0) {Log.i(TAG, "onRequestFailedCallback" + "arg0 = " + arg0);}// 查詢entity回調(diào)接口,返回查詢結(jié)果列表@Overridepublic void onQueryEntityListCallback(String arg0) {Log.i(TAG, "onQueryEntityListCallback" + " arg0 = " + arg0);}};//查詢實時軌跡client.queryEntityList(serviceId, entityNames, columnKey, returnType, activeTime, pageSize,pageIndex, entityListener);}調(diào)用這么一個代碼段之后。我們能夠?qū)嵢缃袷謾C(jī)端查看被追蹤者的實時位置。
還有這么一種情況,跑步類的APP他們是怎么繪制出跑步軌跡的呢。接下來就是見證奇跡的時刻!
/*** 鷹眼查詢歷史軌跡*/private void findLocationOnHistory() {//entity標(biāo)識String entityName = "test";//是否返回精簡的結(jié)果(0 : 將僅僅返回經(jīng)緯度,1 : 將返回經(jīng)緯度及其它屬性信息)int simpleReturn = 1;//開始時間(Unix時間戳)int startTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);//結(jié)束時間(Unix時間戳)int endTime = (int) (System.currentTimeMillis() / 1000);//分頁大小int pageSize = 1000;//分頁索引int pageIndex = 1;//軌跡查詢監(jiān)聽器OnTrackListener trackListener = new OnTrackListener() {//請求失敗回調(diào)接口@Overridepublic void onRequestFailedCallback(String arg0) {Log.i(TAG, "onRequestFailedCallback" + "arg0 = " + arg0);}// 查詢歷史軌跡回調(diào)接口@Overridepublic void onQueryHistoryTrackCallback(String arg0) {Log.i(TAG, "onQueryHistoryTrackCallback" + "arg0 = " + arg0);}};//查詢歷史軌跡client.queryHistoryTrack(serviceId, entityName, simpleReturn, startTime, endTime,pageSize, pageIndex, trackListener);}鐺鐺鐺。歷史軌跡查詢。能夠查詢某段事件之內(nèi)的歷史軌跡。再結(jié)合Android 百度地圖周邊雷達(dá)(v3.7.0)及覆蓋物。繪制出路線就可以實現(xiàn)“跑步軌跡”。
如果有這么一種需求,被追蹤者進(jìn)入某片區(qū)域時我們要能夠及時知道。
百度鷹眼軌跡SDK給我們提供了這樣的方法。地理圍欄。
用圍欄把被追蹤者“圍”起來怎么樣?被追蹤者進(jìn)入,我們能夠收到通知。哈哈
既然用到地理圍欄,那么肯定要創(chuàng)建一個圍欄啦!在本Demo在onCreate中就創(chuàng)建了一個圍欄。詳細(xì)例如以下
/*** 創(chuàng)建圍欄*/private void createFence() {geoFenceListener = new OnGeoFenceListener() {//請求失敗回調(diào)接口@Overridepublic void onRequestFailedCallback(String arg0) {Log.i(TAG, "geoFence請求失敗 :" + "arg0 = " + arg0);}//創(chuàng)建圓形圍欄回調(diào)接口@Overridepublic void onCreateCircularFenceCallback(String arg0) {Log.i(TAG, "創(chuàng)建圓形圍欄回調(diào)接口消息 : " + "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();}}//更新圓形圍欄回調(diào)接口@Overridepublic void onUpdateCircularFenceCallback(String arg0) {Log.i(TAG, "更新圓形圍欄回調(diào)接口消息 :" + "arg0 = " + arg0);}//延遲報警回調(diào)接口@Overridepublic void onDelayAlarmCallback(String arg0) {Log.i(TAG, "延遲報警回調(diào)接口消息 :" + "arg0 = " + arg0);}//刪除圍欄回調(diào)接口@Overridepublic void onDeleteFenceCallback(String arg0) {Log.i(TAG, "刪除圍欄回調(diào)接口消息 :" + "arg0 = " + arg0);}//查詢圍欄列表回調(diào)接口@Overridepublic void onQueryFenceListCallback(String arg0) {Log.i(TAG, "查詢圍欄列表回調(diào)接口消息 : " + "arg0 = " + arg0);}//查詢歷史報警回調(diào)接口@Overridepublic void onQueryHistoryAlarmCallback(String arg0) {Log.i(TAG, "查詢歷史報警回調(diào)接口消息 : " + "arg0 = " + arg0);}//查詢監(jiān)控對象狀態(tài)回調(diào)接口@Overridepublic void onQueryMonitoredStatusCallback(String arg0) {Log.i(TAG, "查詢監(jiān)控對象狀態(tài)回調(diào)接口消息 : " + "arg0 = " + arg0);}};//創(chuàng)建者(entity標(biāo)識)String creator = "test";//圍欄名稱String fenceName = "school";//圍欄描寫敘述String fenceDesc = "學(xué)校";//監(jiān)控對象列表(多個entityName,以英文逗號"," 切割)String monitoredPersons = "test";//觀察者列表(多個entityName,以英文逗號"," 切割)String observers = "test";//生效時間列表String validTimes = "";//生效周期int validCycle = 4;//圍欄生效日期String validDate = "";//生效日期列表String validDays = "";//坐標(biāo)類型 (1:GPS經(jīng)緯度。2:國測局經(jīng)緯度,3:百度經(jīng)緯度)int coordType = 3;//圍欄圓心(圓心位置, 格式 : "經(jīng)度,緯度")String center = "120.2126083541,30.245619808604";//圍欄半徑(單位 : 米)double radius = 500;//報警條件(1:進(jìn)入時觸發(fā)提醒。2:離開時觸發(fā)提醒,3:進(jìn)入離開均觸發(fā)提醒)int alarmCondition = 3;//創(chuàng)建圓形地理圍欄client.createCircularFence(serviceId, creator, fenceName, fenceDesc, monitoredPersons,observers,validTimes, validCycle, validDate, validDays, coordType, center, radius,alarmCondition, geoFenceListener);}這里有個坑我到如今都沒爬出來:int validCycle = 4;百度文檔里validCycle =5 跑步起來仿照Demo中改為4就能夠了。希望明確這個字段意義的同學(xué)能私信我。
代碼段有些長,可是邏輯還是非常清楚的。相信聰明的你一定能夠看懂。
注意:SDK中地理圍欄接口都是異步調(diào)用,須要實例化監(jiān)聽器來獲取調(diào)用結(jié)果。圍欄都創(chuàng)建好了,就看獵物進(jìn)不進(jìn)了。
/** 圍欄查詢實時狀態(tài) */private void findFenceAtTime() {if (fenceId != 0) {//監(jiān)控對象列表(多個entityName,以英文逗號"," 切割)String monitoredPersons = "test";//查詢實時狀態(tài)client.queryMonitoredStatus(serviceId, fenceId, monitoredPersons, geoFenceListener);}}/** 圍欄歷史報警信息 */private void findFenceOnHistory() {if (fenceId != 0) {//監(jiān)控對象列表(多個entityName,以英文逗號"," 切割)String monitoredPersons = "test";//開始時間(unix時間戳)int beginTime = (int) (System.currentTimeMillis() / 1000 - 12 * 60 * 60);//結(jié)束時間(unix時間戳)int endTime = (int) (System.currentTimeMillis() / 1000);//查詢歷史報警信息client.queryFenceHistoryAlarmInfo(serviceId, fenceId, monitoredPersons, beginTime, endTime,geoFenceListener);}}這里列出來兩種圍欄狀態(tài)查詢。一種是實時查詢還一個是歷史報警信息查詢。凝視非常多就不啰嗦了。
至此,百度鷹眼軌跡SDK所有功能都展示一遍。
歡迎訪問我的博客及另外兩篇關(guān)于百度地圖SDK的博文,綜合使用能夠?qū)崿F(xiàn)很多其它效果:
我的博客
Android 百度地圖周邊雷達(dá)(v6.1.3)及覆蓋物
Android 百度定位SDK(v6.1.3)結(jié)合方向傳感器
Demo所有代碼及資源下載:http://download.csdn.net/detail/qq_17250009/9469613
轉(zhuǎn)載于:https://www.cnblogs.com/gavanwanggw/p/7389265.html
總結(jié)
以上是生活随笔為你收集整理的Android 百度鹰眼轨迹SDK(v2.1.6)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: eclipse中的debug按钮组突然找
- 下一篇: 浅谈.NET中的类型和装箱、拆箱原理