2019-03-01Android 集成高德地圖實現(xiàn)簽到打卡功能

最近公司要做一個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);

}

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容