最近公司要做一個OA辦公項目,其中有一個需求為根據(jù)一個地點在這個地點多少米范圍之內(nèi)可以打卡簽到。
Emmm? 話不多說去實現(xiàn)該需求。 這個需求高德百度都可以實現(xiàn)。在此用的是高德SDK。
邏輯?
1.所用到的有? 定位sdk 和地圖sdk?
2.邏輯----->獲取定位信息------->在指定打卡簽到區(qū)域添加圍欄----->圍欄添加成功后畫出圍欄范圍
----->注冊廣播(接收進出入圍欄廣播,當用戶進入此區(qū)域就可以實現(xiàn)打卡簽到邏輯)??
github地址:https://github.com/CreatNameFy/PunchDemo
注意事項
1.在定位的時候不要持續(xù)定位不然滑動地圖會自動回來? 當然需求要持續(xù)定位那就自己想辦法啦?
2.在定位成功返回的參數(shù)中獲取定位時間? 不要那本地時間戳來進行判斷? 因為用戶可以修改時間啦
效果圖

代碼 有需要再貼? 懶哈哈
以下為代碼部門?
獲取經(jīng)緯度的代碼略過
1通過經(jīng)緯度添加圍欄
//注冊廣播? 接收進入圍欄 在圍欄中? 離開圍欄三種狀態(tài)====================================
// 注冊圍欄狀態(tài)廣播
? ? protected? void registerReceiver(){
//接受定位廣播
? ? ? ? IntentFilter filter =new IntentFilter(
ConnectivityManager.CONNECTIVITY_ACTION);
filter.addAction(GEOFENCE_BROADCAST_ACTION);
mBReceiver =new MyBroadcastReceiver();
registerReceiver(mBReceiver, filter);
}
class MyBroadcastReceiverextends BroadcastReceiver {
@Override
? ? ? ? public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(GEOFENCE_BROADCAST_ACTION)) {
//解析廣播內(nèi)容
? ? ? ? ? ? ? ? Bundle bundle = intent.getExtras();
//獲取當前有觸發(fā)的圍欄對象:
? ? ? ? ? ? ? ? GeoFence fence = bundle.getParcelable(GeoFence.BUNDLE_KEY_FENCE);
int status = bundle.getInt(GeoFence.BUNDLE_KEY_FENCESTATUS);
StringBuffer sb =new StringBuffer();
switch (status) {
case GeoFence.STATUS_LOCFAIL:
//? ? ? ? ? ? ? ? ? ? ? ? 定位失敗
? ? ? ? ? ? ? ? ? ? ? ? break;
case GeoFence.STATUS_IN:
enter();
Log.e(TAG,"進入圍欄");
break;
case GeoFence.STATUS_OUT:
out();
Log.e(TAG,"離開圍欄");
break;
case GeoFence.STATUS_STAYED:
Log.e(TAG,"停留圍欄");
break;
default:
break;
}
}
}
}
//創(chuàng)建添加圍欄回調(diào)======================================
GeoFenceListener listener=new GeoFenceListener() {
@Override
? ? public void onGeoFenceCreateFinished(List<GeoFence> list, int errorCode, String s) {
? ? ? ? if (errorCode == GeoFence.ADDGEOFENCE_SUCCESS) {//判斷圍欄是否創(chuàng)建成功
? ? ? ? ? ? Log.d("test", "添加圍欄成功!!");
locationUtil.circle(aMap,l,l1,bean.getData().getDistance());
? ? ? ? ? ? //? ? ? ? ? ? 添加圍欄成功后注冊廣播監(jiān)聽進出圍欄
? ? ? ? ? ? registerReceiver();
? ? ? ? } else {
? ? ? ? ? ? Log.d("test", "添加圍欄失敗!!");
}
}
};
// 添加圍欄==========================================================================
? ? //1上下文 2創(chuàng)建圍欄監(jiān)聽3,圍欄半徑4 5 經(jīng)緯度
????add(mContext,listener,10,l,l1);
? ? public void add(Context context,GeoFenceListener mGeoFenceListener,int m,double latitude,double ????????longitude) {
????????GeoFenceClient mGeoFenceClient=new GeoFenceClient(context);
????????//創(chuàng)建一個中心點坐標
? ? ? ? DPoint centerPoint =new DPoint();
????????//設置中心點緯度
? ? ? ? centerPoint.setLatitude(latitude);
????????//設置中心點經(jīng)度
? ? ? ? centerPoint.setLongitude(longitude);
????//執(zhí)行添加圍欄的操作
? ? ? ? mGeoFenceClient.addGeoFence (centerPoint,m/2,"公司打卡");
????mGeoFenceClient.setGeoFenceListener(mGeoFenceListener);
????mGeoFenceClient.setActivateAction(GeoFenceClient.GEOFENCE_IN| GeoFenceClient.GEOFENCE_OUT| ????GeoFenceClient.GEOFENCE_STAYED);
? ? //GEOFENCE_BROADCAST_ACTION? 為自定義的字符串
????mGeoFenceClient.createPendingIntent(GEOFENCE_BROADCAST_ACTION);
}
//繪制圍欄
public void circle(AMap aMap,double v1,double v2,int m) {
LatLng latLng =new LatLng(v1, v2);
aMap.addCircle(new CircleOptions().center(latLng)
.radius(m/2).strokeColor(Color.parseColor("#3F51B5"))
.fillColor(Color.argb(100,29,161,242)).strokeWidth(5));
}
// 隱藏定位顯示的圓圈
public void set(AMap aMap) {
MyLocationStyle locationStyle =new MyLocationStyle();
locationStyle.strokeColor(Color.argb(0,0,0,0));
locationStyle.radiusFillColor(Color.argb(0,0,0,0));
locationStyle.strokeWidth(0);
aMap.setMyLocationStyle(locationStyle);
}