最近公司要做一个OA办公项目,其中有一个需求为根据一个地点在这个地点多少米范围之内可以打卡签到。
Emmm 话不多说去实现该需求。 这个需求高德百度都可以实现。在此用的是高德SDK。
逻辑
1.所用到的有 定位sdk 和地图sdk
2.逻辑----->获取定位信息------->在指定打卡签到区域添加围栏----->围栏添加成功后画出围栏范围
----->注册广播(接收进出入围栏广播,当用户进入此区域就可以实现打卡签到逻辑)
github地址:https://github.com/CreatNameFy/PunchDemo
注意事项
1.在定位的时候不要持续定位不然滑动地图会自动回来 当然需求要持续定位那就自己想办法啦
2.在定位成功返回的参数中获取定位时间 不要那本地时间戳来进行判断 因为用户可以修改时间啦
效果图
![](https://img.haomeiwen.com/i9742866/7ba7d99aa2490d36.jpg)
代码 有需要再贴 懒哈哈
以下为代码部门
获取经纬度的代码略过
1通过经纬度添加围栏
//注册广播 接收进入围栏 在围栏中 离开围栏三种状态====================================
// 注册围栏状态广播
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)) {
//解析广播内容
Bundle bundle = intent.getExtras();
//获取当前有触发的围栏对象:
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;
}
}
}
}
//创建添加围栏回调======================================
GeoFenceListener listener=new GeoFenceListener() {
@Override
public void onGeoFenceCreateFinished(List<GeoFence> list, int errorCode, String s) {
if (errorCode == GeoFence.ADDGEOFENCE_SUCCESS) {//判断围栏是否创建成功
Log.d("test", "添加围栏成功!!");
locationUtil.circle(aMap,l,l1,bean.getData().getDistance());
// 添加围栏成功后注册广播监听进出围栏
registerReceiver();
} else {
Log.d("test", "添加围栏失败!!");
}
}
};
// 添加围栏==========================================================================
//1上下文 2创建围栏监听3,围栏半径4 5 经纬度
add(mContext,listener,10,l,l1);
public void add(Context context,GeoFenceListener mGeoFenceListener,int m,double latitude,double longitude) {
GeoFenceClient mGeoFenceClient=new GeoFenceClient(context);
//创建一个中心点坐标
DPoint centerPoint =new DPoint();
//设置中心点纬度
centerPoint.setLatitude(latitude);
//设置中心点经度
centerPoint.setLongitude(longitude);
//执行添加围栏的操作
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);
}
网友评论