首頁>科技>

先看下實現效果:

鷹眼是一套軌跡管理服務,接入該服務後,可追蹤車輛/人員等運動物體,實現實時定位、軌跡追蹤和軌跡儲存查詢等功能。基於鷹眼提供的介面和雲端服務,可以迅速構建一套完全屬於您自己的完整、精準且高效能的軌跡管理系統,可應用於車隊管理、人員管理等領域。具體請檢視官網介紹。

這篇文章就講一下如何在Android App中實現軌跡追蹤,既然要追蹤軌跡,肯定得先獲取這個裝置的一系列軌跡點,這就需要我們在終端整合鷹眼服務。我們以Android手機為例,整合鷹眼軌跡SDK後,App將會按照我們設定的頻率主動採集實時軌跡。

什麼是Android鷹眼軌跡SDK?

鷹眼軌跡是一套基於Android 2.1及以上版本裝置的應用程式介面, 可以通過該介面實現軌跡追蹤功能:

軌跡追蹤:按照設定的頻率主動採集實時軌跡軌跡儲存:雲端實現海量軌跡資料儲存軌跡查詢:查詢被追蹤者實時位置、歷史軌跡和里程軌跡糾偏:雲端對軌跡進行實時去噪、綁路、抽稀處理,解決軌跡偏移問題地理圍欄:當被追蹤者進出一定範圍(圓形、多邊形、線型、行政區)的虛擬地理區域時,監控者可以接收到自動報警通知影象儲存:支援隨軌跡上傳、儲存和查詢影象檔案


接入鷹眼服務

開發工具:Android Studio

二. 建立鷹眼服務

1. 建立服務進入鷹眼軌跡管理平臺,點選"建立服務"按鈕,在彈窗中填寫資訊後完成服務建立。

2. 獲取 service_id建立服務成功後即可列表左側的"系統 ID(service_id)",如:217548,即為訪問該service的唯一標識,在後續的介面呼叫中均要使用。

三. 接入鷹眼服務1. 配置庫檔案

SDK下載地址:/file/2020/01/10/20200110143731_48678.jpg.html build.gradle的android標籤中加入如下程式碼並Sync Now。

sourceSets {    main {        jniLibs.srcDirs = ['libs']    }}
2. 設定AndroidManifest.xml
<service           android:name="com.baidu.trace.LBSTraceService"           android:enabled="true"          android:process=":remote"/> 
<meta-data    android:name="com.baidu.lbsapi.API_KEY"    android:value="上面申請的ak值" />
4. 初始化軌跡服務
// 軌跡服務ID long serviceId = 0;// 裝置標識String entityName = "myTrace";// 是否需要物件儲存服務,預設為:false,關閉物件儲存服務。注:鷹眼 Android SDK v3.0以上版本支援隨軌跡上傳影象等物件資料,若需使用此功能,該引數需設為 true,且需匯入bos-android-sdk-1.0.2.jar。boolean isNeedObjectStorage = false;// 初始化軌跡服務Trace mTrace = new Trace(serviceId, entityName, isNeedObjectStorage);// 初始化軌跡服務客戶端LBSTraceClient mTraceClient = new LBSTraceClient(getApplicationContext());
5. 設定定位和回傳週期

鷹眼軌跡資料傳輸採取定期打包回傳的方式,以節省流量。開發者可以自定義定位頻率和打包回傳頻率,頻率可設定範圍為:2~300秒。例如:定位頻率為5s,打包回傳頻率為10s,則2次定位後打包回傳一次。

// 定位週期(單位:秒)int gatherInterval = 5;// 打包回傳週期(單位:秒)int packInterval = 10;// 設定定位和打包週期mTraceClient.setInterval(gatherInterval, packInterval);
6. 初始化監聽器
    // 初始化軌跡服務監聽器    OnTraceListener mTraceListener = new OnTraceListener() {        /**         * 繫結服務回撥介面         * @param i  狀態碼         * @param s 訊息 0:成功 1:失敗         */        @Override        public void onBindServiceCallback(int i, String s) {            Log.e(TAG,"繫結服務回撥");            Log.e(TAG,i+"");            Log.e(TAG,s+"");        }        /**         * 開啟服務回撥介面         * @param status 狀態碼         * @param message 訊息         *                <pre>0:成功 </pre>         *                <pre>10000:請求傳送失敗</pre>         *                <pre>10001:服務開啟失敗</pre>         *                <pre>10002:引數錯誤</pre>         *                <pre>10003:網路連線失敗</pre>         *                <pre>10004:網路未開啟</pre>         *                <pre>10005:服務正在開啟</pre>         *                <pre>10006:服務已開啟</pre>         */        @Override        public void onStartTraceCallback(int status, String message) {            Log.e(TAG,"開啟服務回撥");            Log.e(TAG,status+"");            Log.e(TAG,message+"");        }        /**         * 停止服務回撥介面         * @param status 狀態碼         * @param message 訊息         *                <pre>0:成功</pre>         *                <pre>11000:請求傳送失敗</pre>         *                <pre>11001:服務停止失敗</pre>         *                <pre>11002:服務未開啟</pre>         *                <pre>11003:服務正在停止</pre>         */        @Override        public void onStopTraceCallback(int status, String message) {            Log.e(TAG,"停止服務回撥");            Log.e(TAG,status+"");            Log.e(TAG,message+"");        }        /**         * 開啟採集回撥介面         * @param status 狀態碼         * @param message 訊息         *                <pre>0:成功</pre>         *                <pre>12000:請求傳送失敗</pre>         *                <pre>12001:採集開啟失敗</pre>         *                <pre>12002:服務未開啟</pre>         */        @Override        public void onStartGatherCallback(int status, String message) {            Log.e(TAG,"開啟採集回撥");            Log.e(TAG,status+"");            Log.e(TAG,message+"");        }        /**         * 停止採集回撥介面         * @param status 狀態碼         * @param message 訊息         *                <pre>0:成功</pre>         *                <pre>13000:請求傳送失敗</pre>         *                <pre>13001:採集停止失敗</pre>         *                <pre>13002:服務未開啟</pre>         */        @Override        public void onStopGatherCallback(int status, String message) {            Log.e(TAG,"停止採集回撥");            Log.e(TAG,status+"");            Log.e(TAG,message+"");        }        /**         * 推送訊息回撥介面         *         * @param messageNo 狀態碼         * @param message 訊息         *                  <pre>0x01:配置下發</pre>         *                  <pre>0x02:語音訊息</pre>         *                  <pre>0x03:服務端圍欄報警訊息</pre>         *                  <pre>0x04:本地圍欄報警訊息</pre>         *                  <pre>0x05~0x40:系統預留</pre>         *                  <pre>0x41~0xFF:開發者自定義</pre>         */        @Override        public void onPushCallback(byte messageNo, PushMessage message) {            Log.e(TAG,"推送訊息回撥");            Log.e(TAG,messageNo+"");            Log.e(TAG,message+"");        }        @Override        public void onInitBOSCallback(int i, String s) {        }    };
7. 開啟軌跡追蹤

開啟軌跡追蹤需要進行以下兩步操作:

(1)開啟鷹眼服務,啟動鷹眼 service

// 開啟服務mTraceClient.startTrace(mTrace, mTraceListener);

(2)開啟軌跡採集,啟動軌跡追蹤。

// 開啟採集mTraceClient.startGather(mTraceListener);

至此,正式開啟軌跡追蹤。

8. 結束軌跡追蹤

結束軌跡追蹤時,可以有兩種選擇:(1)停止軌跡服務:此方法將同時停止軌跡服務和軌跡採集,完全結束鷹眼軌跡服務。若需再次啟動軌跡追蹤,需重新啟動服務和軌跡採集,示例程式碼如下:

// 停止服務mTraceClient.stopTrace(mTrace, mTraceListener);

(2)停止軌跡採集:此方法將停止軌跡採集,但不停止軌跡服務(即,不再採集軌跡點了,但鷹眼 service 還存活)。

// 停止採集mTraceClient.stopGather(mTraceListener);

接入鷹眼服務按照官方文件很容易實現,在實際專案中其實經常需要後臺執行,所以可以將這些邏輯放到 service 中來實現,然後做相應的服務保活,讓其在後臺進行軌跡採集。而像軌跡服務、軌跡服務客戶端這些物件或變數可以放到 application 中,以方便在整個應用中使用。

四、自定義屬性上傳1. 軌跡點自定義屬性資料上傳

顧名思義,軌跡點自定義屬性資料上傳就是針對每一個軌跡點增加上傳的自定義屬性欄位,軌跡中的每個位置點可擁有一系列開發者自定義的描述欄位,如汽車的電量、發動機轉速等,用以記錄行程中的實時狀態資訊。

為實現自定義屬性資料上傳,開發者須重寫OnCustomAttributeListener監聽器中的onTrackAttributeCallback()介面,呼叫 LBSTraceClient.setOnCustomAttributeListener()方法設定自定義屬性監聽器,並按照設定的定位週期更新onTrackAttributeCallback()的返回值,示例如下:

// 為實現自定義屬性資料上傳,須重寫OnCustomAttributeListener監聽器中的onTrackAttributeCallback()介面mTraceClient.setOnCustomAttributeListener(new OnCustomAttributeListener() {    @Override    public Map<String, String> onTrackAttributeCallback() {        Map<String, String> map = new HashMap<String, String>();        map.put("key1", "value1");        map.put("key2", "value2");        return map;    }    //l - 回撥時定位點的時間戳(毫秒)    @Override    public Map<String, String> onTrackAttributeCallback(long l) {        return null;    }});

SDK每採集一次軌跡,便會自動回撥onTrackAttributeCallback()介面,獲取屬性值並寫入當前軌跡點的屬性欄位中。onTrackAttributeCallback()的返回值是Map<String, String>型別,每個物件都是一個<key,value>對,其中key為自定義欄位名稱,value為值。

2. 自定義entity屬性上傳

這裡先說明一下,上面的軌跡點自定義屬性上傳指的是每一個軌跡點增加上傳的自定義屬性欄位。我們目前每一個裝置有一個裝置標識,也就是在初始化軌跡服務傳入的 entityName ,那如果我們還需要上傳當前這個entity的其他屬性,比如使用者姓名、年齡或性別等該如何做呢?

方式一:通過呼叫 addEntity() 方法主動新增這種方式等於我們主動新增一個entity,也就不需要我們在初始化軌跡服務傳入 entityName ,addEntity()方法需要傳入兩個引數,具體使用方式可以看鷹眼SDK的API文件,示例如下:

AddEntityRequest request = new AddEntityRequest();request.setServiceId(serviceId);request.setEntityName(entityName);Map<String, String> columns = new HashMap<String, String>();columns.put("USER_ID", "1001");columns.put("USER_SEX", "男");columns.put("ACC_NBR", "1234567890");request.setColumns(columns);mTraceClient.addEntity(request, new OnEntityListener() {    @Override    public void onAddEntityCallback(AddEntityResponse addEntityResponse) {        super.onAddEntityCallback(addEntityResponse);    }});

方式二:通過呼叫 updateEntity() 方法指定自定義屬性如果我們在初始化軌跡服務傳入了entityName ,服務端將會自動建立以entityName命名的entity。由於服務端自動建立的entity不包含自定義屬性的值,若需要指定entity自定義屬性,需要再呼叫updateEntity()方法,通過columnKey欄位指定自定義屬性的值。示例如下:

//自定義entity屬性上傳UpdateEntityRequest updateEntityRequest = new UpdateEntityRequest();updateEntityRequest.setServiceId(serviceId);updateEntityRequest.setEntityName(entityName);Map<String, String> columns = new HashMap<String, String>();columns.put("USER_ID", "1001");columns.put("USER_SEX", "男");columns.put("ACC_NBR", "1234567890");updateEntityRequest.setColumns(columns);mTraceClient.updateEntity(updateEntityRequest, new OnEntityListener() {     @Override     public void onAddEntityCallback(AddEntityResponse addEntityResponse) {         super.onAddEntityCallback(addEntityResponse);     } });

最後附上Demo地址,GitHub:https://github.com/yangxch/YingYan

最新評論
  • 整治雙十一購物亂象,國家再次出手!該跟這些套路說再見了
  • 一代電商巨頭將告別?銷售額曾是京東6倍,現在網站關閉重整