模糊的Beacon追蹤
我們的方法簡單而有效--保留了最近15秒的報告中提示位于范圍內的Beacon的相關數(shù)據(jù)緩存,以及每個Beacon最近一次被探測到的精確時間。通過計時器任務,把最近15秒內沒有被探測到的Beacon視為“過期”、移除緩存。
在可以稱得上“重中之重”的didRangeBeaconsInRegion方法中,我們更新了Beacon數(shù)據(jù)緩存和回調的Beacon對象列表,然后評估全部的緩存數(shù)據(jù),以判定目前距離最近的Beacon。于是測試的結果有了改善。這類似于數(shù)據(jù)平滑處理,相關代碼片段如下圖。
圖5 - GyboApplication.java中的Beacon緩存設置和使用
圖6 -BeaconEvent類別
圖7 -負責終止BeaconEvent對象的計時器任務
最后的最后,提醒用戶!
一旦實際執(zhí)行了獲取范圍內Beacon報告的代碼、采取了某種方式追蹤Beacon、并根據(jù)獲得的數(shù)據(jù)判斷哪一個Beacon離游客最近,那么就只剩最后一步了:在合適的情況下提示游客Beacon所關聯(lián)的展品信息。怎樣判斷是否“合適”呢?主要看最后一次生成的通知是否為同一Beacon相關的,因為沒有必要反復提示用戶同一個展品的信息。還需要將估算的Beacon距離與既設的(觸發(fā)行為的)最小距離值進行對比,判斷游客是否足夠靠近Beacon(也就是展品),然后決定是否發(fā)送展品信息。
如果APP是在前臺運行,提示游客的方法就很簡單:更新主要展覽信息頁面、顯示最近的展品介紹。我們使用內存中有關Beacon及其對應展品的數(shù)據(jù)結構,每個Beacon都有自己的ID,就可以分別對應各自的展品信息,并在APP本地映射了這些數(shù)據(jù)的對應關系,但正如第一篇中所講到的,對于除了原型以外的任何APP,最好從遠程服務器上獲取相關數(shù)據(jù),根據(jù)位置或其他信息配置Beacon。
圖8 -Beacon Information類別
圖9 -ThingOfInterest類別
通知列表下拉菜單中的通知,并將其鏈接到定義展品信息頁面的Activity。
圖10 - 安卓系統(tǒng)通知,提示附近發(fā)現(xiàn)
下圖是安卓通知的代碼。
圖11 - 創(chuàng)建通知