第一步,創建地理圍欄
地理圍欄沒有最大個數限制,您可以無限制的創建圍欄。但請您根據業務需求合理的創建圍欄,控制圍欄個數可以有效的保證程序執行效率。定位 SDK 提供根據高德POI、行政區劃,自定義圓形、多邊形四種方式創建地理圍欄。
1、創建地理圍欄對象
這裏還包括設置一些基本參數:
//實例化地理圍欄客戶端
GeoFenceClient mGeoFenceClient = new GeoFenceClient(getApplicationContext());
//設置希望偵測的圍欄觸發行爲,默認只偵測用戶進入圍欄的行爲
//public static final int GEOFENCE_IN 進入地理圍欄
//public static final int GEOFENCE_OUT 退出地理圍欄
//public static final int GEOFENCE_STAYED 停留在地理圍欄內10分鐘
mGeoFenceClient.setActivateAction(GEOFENCE_IN|GEOFENCE_OUT|GEOFENCE_STAYED);
2、創建高德POI地理圍欄
提供兩個創建高德POI圍欄的接口,一個是根據關鍵字創建POI圍欄,另一個是根據經緯度進行周邊搜索創建POI圍欄。
根據關鍵字創建圍欄
通過以下方法執行POI關鍵字搜索並創建高德POI地理圍欄。
mGeoFenceClient.addGeoFence(String keyword, String poiType, String city, int size,String customId);
參數說明
參數說明示例
keywordPOI關鍵字例如:首開廣場
poiTypePOI類型例如:寫字樓
cityPOI所在的城市名稱例如:北京
customId與圍欄關聯的自有業務Id
示例代碼
mGeoFenceClient.addGeoFence("首開廣場","寫字樓","北京",1,"000FATE23(考勤打卡)");
根據周邊POI創建圍欄
通過以下方法執行POI周邊搜索並創建高德POI地理圍欄。
mGeoFenceClient.addGeoFence(String keyword, String poiType, DPoint point, float aroundRadius, int size,String customId);
參數說明
參數說明示例
keywordPOI關鍵字例如:首開廣場
poiTypePOI類型例如:寫字樓
point周邊區域中心點的經緯度,以此中心點建立周邊地理圍欄例如:北京
aroundRadius周邊半徑,0-50000米,默認3000米
customId與圍欄關聯的自有業務Id
示例代碼
//創建一箇中心點座標
DPoint centerPoint = new DPoint();
//設置中心點緯度
centerPoint.setLatitude(39.123D);
//設置中心點經度
centerPoint.setLongitude(116.123D);
//執行添加圍欄的操作
mGeoFenceClient.addGeoFence("肯德基","餐飲",centerPoint,1000F,10,"自有ID");
3、創建行政區劃圍欄
可根據行政區劃關鍵字創建行政區劃圍欄。
根據關鍵字創建圍欄
mGeoFenceClient.addGeoFence(String keyword, String customId);
參數說明
參數說明示例
keyword行政區劃關鍵字例如:朝陽區
customId與圍欄關聯的自有業務Id
示例代碼
mGeoFenceClient.addGeoFence("海淀區","00FDTW103(在北京海淀的化妝品促銷活動)");
4、創建自定義圍欄
自定義圍欄包含圓形圍欄、多邊形圍欄兩種,自定義圍欄一次接口調用只可以創建一個圍欄,創建多個自定義圍欄需要多次調用創建接口。
圓形圍欄
圓形圍欄需要提供中心點,以及半徑。
mGeoFenceClient.addGeoFence(Point point,float radius, String customId);
參數說明
參數說明示例
point圍欄中心點
radius要創建的圍欄半徑 ,半徑無限制,單位米
customId與圍欄關聯的自有業務Id
示例代碼
/創建一箇中心點座標
DPoint centerPoint = new DPoint();
//設置中心點緯度
centerPoint.setLatitude(39.123D);
//設置中心點經度
centerPoint.setLongitude(116.123D);
mGeoFenceClient.addGeoFence (centerPoint,500F,"自有業務Id");
多邊形圍欄
mGeoFenceClient.addGeoFence(List points, String customId);
參數說明
參數說明示例
points多邊形的邊界座標點,最少傳3個
customId與圍欄關聯的自有業務Id
示例代碼
List points = new ArrayList();
points.add(new DPoint(39.992702, 116.470470));
points.add(new DPoint(39.994387, 116.472498));
points.add(new DPoint(39.994478, 116.474161));
points.add(new DPoint(39.993163, 116.474504));
points.add(new DPoint(39.991363, 116.472605));
mGeoFenceClient.addGeoFence(points,"自有業務ID");
第二步,開始定位
當圍欄創建完畢,且圍欄創建成功時會啓動定位,這部分無需您來設置,SDK內部執行。
啓動的定位機制:通過“遠離圍欄時的超低頻定位策略”來降低電量消耗,“離近圍欄會逐漸提高定位頻率”,保證有足夠的定位精度來完成圍欄位置檢測。
需要注意,如果您希望程序在後臺持續檢測圍欄觸發行爲,您務必要在應用本地服務中啓動 GeoFenceClient,且確保這個本地服務一直存活。
下面介紹如何知道創建圍欄是成功還是失敗。
第三步,接收圍欄創建後的回調
圍欄創建完畢的信息會通過 GeoFenceListener 進行回調。可以在回調中知道創建圍欄成功與否,以及查看所創建圍欄的具體內容。
//創建回調監聽
GeoFenceListener fenceListenter = new GeoFenceListener() {
public void onGeoFenceCreateFinished(List geoFenceList,
int errorCode) {
if(errorCode == GeoFence.ADDGEOFENCE_SUCCESS){//判斷圍欄是否創建成功
tvReult.setText("添加圍欄成功!!");
//geoFenceList是已經添加的圍欄列表,可據此查看創建的圍欄
} else {
tvReult.setText("添加圍欄失敗!!");
}
}
};
mGeoFenceClient.setGeoFenceListener(fenceListenter);//設置回調監聽
第四步,接收圍欄觸發行爲廣播
用戶與圍欄位置發生變化的行爲稱爲圍欄觸發行爲,圍欄觸發行爲也是用戶進入圍欄、退出圍欄、在圍欄內停留這三種行爲的統稱,行爲的觸發是通過Android 的廣播進行發送的。
圍欄觸發行爲的廣播內容是可選性的,在第一步“創建地理圍欄對象”中講到可以應用 setActiveAction(int[] actions) 方法設置希望偵測到的圍欄觸發行爲。
當定位啓動後會馬上得到符合希望的所有圍欄的狀態檢測廣播,這些廣播會告訴上層邏輯每個圍欄和當前用戶位置的初始狀態究竟是IN(定位點在圍欄裏)還是OUT(定位點在圍欄外),這種廣播不是圍欄觸發行爲廣播,是每個圍欄的初始狀態廣播,不會經常收到,在有新的圍欄被創建,或者希望偵測的Action改變時會收到。接下來的每次廣播都是圍欄觸發行爲廣播(當然,觸發前提是位置和圍欄的關係發生了改變)。
1、創建並設置PendingIntent
//定義接收廣播的action字符串
public static final String GEOFENCE_BROADCAST_ACTION = "com.location.apis.geofencedemo.broadcast";
//創建並設置PendingIntent
mGeoFenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);
2、創建廣播監聽
private BroadcastReceiver mGeoFenceReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) {
//解析廣播內容
}
}
};
3、註冊廣播
IntentFilter filter = new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(GEOFENCE_BROADCAST_ACTION);
registerReceiver(mGeoFenceReceiver, filter);
4、解析廣播內容
當上一步完成之後,可以在第2步創建的監聽器中在 onReceive 方法中對廣播內容進行解析。廣播內容是通過 Bundle 進行傳遞的。
//獲取Bundle
Bundle bundle = intent.getExtras();
//獲取圍欄行爲:
int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS);
//獲取自定義的圍欄標識:
String customId = bundle.getString(GeoFence.BUNDLE_KEY_CUSTOMID);
//獲取圍欄ID:
String fenceId = bundle.getString(GeoFence.BUNDLE_KEY_FENCEID);
//獲取當前有觸發的圍欄對象:
GeoFence fence = bundle.getParcelable(GeoFence.BUNDLE_KEY_FENCE);
最後,清除所有圍欄
當不再需要使用圍欄時,可以調用以下代碼對已經設定的圍欄進行清除操作。
//會清除所有圍欄
mGeoFenceClient.removeGeoFence();