小編這次要給大家分享的是Android如何實現(xiàn)百度地圖地點簽到功能,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。
創(chuàng)新互聯(lián)公司主要從事做網(wǎng)站、成都網(wǎng)站設(shè)計、網(wǎng)頁設(shè)計、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)羅江,十載網(wǎng)站建設(shè)經(jīng)驗,價格優(yōu)惠、服務(wù)專業(yè),歡迎來電咨詢建站服務(wù):18982081108
前言:先寫個簡單的地點簽到功能,如果日后有時間細(xì)寫的話,會更加好好研究一下百度地圖api,做更多邏輯判斷。
這里主要是調(diào)用百度地圖中的場景定位中的簽到場景。通過官方文檔進(jìn)行api集成。通過GPS的定位功能,獲取地理位置,時間,用戶名進(jìn)行存儲。之后通過日歷顯示歷史簽到記錄。
效果圖:
/**百度地圖sdk**/ implementation files('libs/BaiduLBS_Android.jar') /**日歷選擇器**/ implementation 'com.prolificinteractive:material-calendarview:1.4.3'
簽到布局:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_ffffff" android:orientation="vertical" tools:context=".activity.SignInActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="20dp" android:orientation="vertical"> <TextView android:id="@+id/sign_calendar" android:layout_width="match_parent" android:layout_height="wrap_content" android:textColor="@color/color_000000" android:textSize="18sp" /> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/check_in_area" /> <View /> <LinearLayout android:id="@+id/line_sign_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="5dp" android:orientation="horizontal" android:visibility="gone"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:layout_margin="5dp" android:src="@mipmap/sign_in_address" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/sign_in_result" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="2dp" android:textColor="@color/color_000000" android:textSize="20sp" /> <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginLeft="5dp" android:text="@string/sign_in_time" /> <TextView android:id="@+id/sign_in_time" android:layout_width="match_parent" android:layout_height="wrap_content" /> </LinearLayout> <TextView android:id="@+id/sign_address" android:layout_width="match_parent" android:layout_height="wrap_content" /> <Button android:id="@+id/btn_sign_again" android:layout_width="120dp" android:layout_height="40dp" android:layout_centerHorizontal="true" android:layout_marginTop="10dp" android:background="@drawable/btn_round_border" android:text="@string/sign_again" android:textAllCaps="false" android:textColor="@color/colorPrimary" android:textSize="15sp" /> </LinearLayout> </LinearLayout> <Button android:id="@+id/btn_sign_in" android:layout_gravity="center_vertical|center_horizontal" android:layout_marginTop="50dp" android:background="@drawable/btn_negative_nomal" android:text="@string/signIn" android:visibility="gone" /> </LinearLayout> </LinearLayout>
SignInActivity.java
public class SignInActivity extends BaseActivity { @BindView(R.id.sign_calendar) TextView signCalender; @BindView(R.id.line_sign_result) LinearLayout lineSignResult; @BindView(R.id.sign_in_result) TextView signInResult; @BindView(R.id.sign_in_time) TextView signInTime; @BindView(R.id.sign_address) TextView signAddress; @BindView(R.id.btn_sign_in) Button btnSignIn; private LocationService mLocationService; private boolean isAgain = false; SignIn signIn = new SignIn(); MyUser myUser = BmobUser.getCurrentUser(MyUser.class); @Override protected int contentViewID() { return R.layout.activity_sign_in; } @Override protected void initialize() { setTopTitle(getString(R.string.signIn), true); setLeftBtnFinish(); setDate(); setLocation(); querySignInState(); } /** * 查詢今日簽到狀態(tài) */ private void querySignInState() { BmobQuery<SignIn> signInBmobQuery = new BmobQuery<SignIn>(); signInBmobQuery.addWhereEqualTo("username", myUser.getUsername()); signInBmobQuery.addWhereEqualTo("date", FormatUtils.getDateTimeString(Calendar.getInstance().getTime(), FormatUtils.template_Date)); signInBmobQuery.findObjects(new FindListener<SignIn>() { @Override public void done(List<SignIn> object, BmobException e) { if (e == null) { if (object.isEmpty()){ isAgain = false; btnSignIn.setVisibility(View.VISIBLE); } else { isAgain = true; SignIn signIn = object.get(0); btnSignIn.setVisibility(View.GONE); lineSignResult.setVisibility(View.VISIBLE); signAddress.setText(signIn.getAddress()); signInTime.setText(signIn.getTime()); signInResult.setText(getString(R.string.sign_in_success)); } } else { isAgain = false; } } }); } private void setLocation() { // 初始化 LocationClient mLocationService = new LocationService(this); // 注冊監(jiān)聽 mLocationService.registerListener(mListener); LocationClientOption option = mLocationService.getOption(); // 簽到場景 只進(jìn)行一次定位返回最接近真實位置的定位結(jié)果(定位速度可能會延遲1-3s) option.setLocationPurpose(LocationClientOption.BDLocationPurpose.SignIn); // 設(shè)置定位參數(shù) mLocationService.setLocationOption(option); } /***** * * 定位結(jié)果回調(diào),重寫onReceiveLocation方法 * */ private BDAbstractLocationListener mListener = new BDAbstractLocationListener() { /** * 定位請求回調(diào)函數(shù) * * @param location 定位結(jié)果 */ @Override public void onReceiveLocation(BDLocation location) { if (null != location && location.getLocType() != BDLocation.TypeServerError && location.getLocType() != BDLocation.TypeOffLineLocationFail && location.getLocType() != BDLocation.TypeCriteriaException) { String address = location.getAddrStr(); //獲取詳細(xì)地址信息 if (!isAgain) { saveSignIn(address); } else { updateSignIn(address); } } else { signInResult.setText(getString(R.string.sign_in_failure)); } } }; private void setDate() { String dateString = FormatUtils.getDateTimeString(Calendar.getInstance().getTime(), FormatUtils.template_Date); String weekString = DateUtils.getDayOfWeek(); String CalendarString = dateString + " " + weekString; signCalender.setText(CalendarString); } @OnClick({R.id.btn_sign_in, R.id.btn_sign_again}) public void onClick(View view) { switch (view.getId()) { case R.id.btn_sign_in: signIn(); break; case R.id.btn_sign_again: isAgain = true; signIn(); break; default: } } /** * 更新簽到數(shù)據(jù) * @param address */ private void updateSignIn(String address) { Calendar calendar = Calendar.getInstance(); SignIn newSignIn = new SignIn(); newSignIn.setUsername(myUser.getUsername()); newSignIn.setAddress(address); signIn.setDate(FormatUtils.getDateTimeString(calendar.getTime(), FormatUtils.template_Date)); signIn.setTime(FormatUtils.getDateTimeString(calendar.getTime(), FormatUtils.template_Time)); newSignIn.update(signIn.getObjectId(), new UpdateListener() { @Override public void done(BmobException e) { if (e == null) { signAddress.setText(address); signInTime.setText(FormatUtils.getDateTimeString(Calendar.getInstance().getTime(), FormatUtils.template_Time)); signInResult.setText(getString(R.string.sign_in_success)); ToastUtils.showShort(SignInActivity.this, getString(R.string.sign_in_success)); } else { ToastUtils.showShort(SignInActivity.this, getString(R.string.sign_in_failure)); } } }); } /** * 保存簽到數(shù)據(jù) * @param address */ private void saveSignIn(String address) { Calendar calendar = Calendar.getInstance(); signIn.setUsername(myUser.getUsername()); signIn.setAddress(address); signIn.setDate(FormatUtils.getDateTimeString(calendar.getTime(), FormatUtils.template_Date)); signIn.setTime(FormatUtils.getDateTimeString(calendar.getTime(), FormatUtils.template_Time)); signIn.save(new SaveListener<String>() { @Override public void done(String s, BmobException e) { if (e == null) { btnSignIn.setVisibility(View.GONE); lineSignResult.setVisibility(View.VISIBLE); signAddress.setText(address); signInTime.setText(FormatUtils.getDateTimeString(Calendar.getInstance().getTime(), FormatUtils.template_Time)); signInResult.setText(getString(R.string.sign_in_success)); ToastUtils.showShort(SignInActivity.this, getString(R.string.sign_in_success)); } else { ToastUtils.showShort(SignInActivity.this, getString(R.string.sign_in_failure)); } } }); } /** * 簽到 */ private void signIn() { if (mLocationService.isStart()) { mLocationService.requestLocation(); return; } //簽到只需調(diào)用startLocation即可 mLocationService.start(); } @Override protected void onDestroy() { super.onDestroy(); if (mLocationService != null) { mLocationService.unregisterListener(mListener); mLocationService.stop(); } } }
歷史簽到布局
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/color_ffffff" tools:context=".activity.MySignInActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:layout_margin="10dp" android:orientation="vertical"> <com.prolificinteractive.materialcalendarview.MaterialCalendarView android:id="@+id/materialCalendarView_sign_in" android:layout_width="match_parent" android:layout_height="300dp" android:background="@color/white" android:clipChildren="false" app:mcv_calendarMode="month" app:mcv_dateTextAppearance="@style/MaterialCalendarTextStyelNormal" app:mcv_firstDayOfWeek="sunday" app:mcv_selectionColor="#D203A9F4" app:mcv_showOtherDates="all" app:mcv_tileSize="match_parent" app:mcv_tileWidth="match_parent" /> <View /> <LinearLayout android:id="@+id/line_my_sign_in" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="15dp" android:visibility="gone" android:orientation="horizontal"> <ImageView android:layout_width="40dp" android:layout_height="40dp" android:layout_margin="5dp" android:src="@mipmap/sign_in_address" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content"> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/color_000000" android:textSize="18sp" android:text="@string/sign_in_time"/> <TextView android:id="@+id/my_sign_in_date" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/color_000000" android:textSize="18sp" android:layout_marginLeft="5dp"/> <TextView android:id="@+id/my_sign_in_time" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="@color/color_000000" android:textSize="18sp" android:layout_marginLeft="5dp"/> </LinearLayout> <TextView android:id="@+id/my_sign_in_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="5dp"/> </LinearLayout> </LinearLayout> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
MySignInActivity.java
public class MySignInActivity extends BaseActivity implements OnDateSelectedListener { @BindView(R.id.my_sign_in_date) TextView mySignInDate; @BindView(R.id.my_sign_in_time) TextView mySignInTime; @BindView(R.id.my_sign_in_address) TextView mySignInAddress; @BindView(R.id.line_my_sign_in) LinearLayout lineMySignIn; @BindView(R.id.materialCalendarView_sign_in) MaterialCalendarView widget; MyUser myUser = BmobUser.getCurrentUser(MyUser.class); private List<CalendarDay> calendarDays = new ArrayList<>(); @Override protected int contentViewID() { return R.layout.activity_my_sign_in; } @Override protected void initialize() { setTopTitle(getString(R.string.my_sign_in), true); setLeftBtnFinish(); widget.setSelectedDate(CalendarDay.today()); widget.state().edit().setMaximumDate(CalendarDay.today()).commit(); widget.setOnDateChangedListener(this); initDate(); querySignInState(Calendar.getInstance()); } private void initDate() { BmobQuery<SignIn> signInBmobQuery = new BmobQuery<SignIn>(); signInBmobQuery.addWhereEqualTo("username", myUser.getUsername()); signInBmobQuery.findObjects(new FindListener<SignIn>() { @Override public void done(List<SignIn> object, BmobException e) { if (e == null) { if (!object.isEmpty()) { for (SignIn signIn : object) { Date date = DateUtils.strToDate(signIn.getDate() + " " + signIn.getTime()); calendarDays.add(CalendarDay.from(date)); } widget.addDecorator(new EventDecorator(ContextCompat.getColor(MySignInActivity.this, R.color.color_1396aa), calendarDays)); } } else { LogUtils.e(e.getMessage()); ToastUtils.showShort(MySignInActivity.this, getString(R.string.query_failure)); } } }); } @Override public void onDateSelected(@NonNull MaterialCalendarView widget, @NonNull CalendarDay date, boolean selected) { querySignInState(date.getCalendar()); } private void querySignInState(Calendar calendar) { BmobQuery<SignIn> signInBmobQuery = new BmobQuery<SignIn>(); signInBmobQuery.addWhereEqualTo("username", myUser.getUsername()); signInBmobQuery.addWhereEqualTo("date", FormatUtils.getDateTimeString(calendar.getTime(), FormatUtils.template_Date)); signInBmobQuery.findObjects(new FindListener<SignIn>() { @Override public void done(List<SignIn> object, BmobException e) { if (e == null) { if (!object.isEmpty()) { lineMySignIn.setVisibility(View.VISIBLE); SignIn signIn = object.get(0); mySignInDate.setText(signIn.getDate()); mySignInTime.setText(signIn.getTime()); mySignInAddress.setText(signIn.getAddress()); } else { lineMySignIn.setVisibility(View.GONE); } } else { ToastUtils.showShort(MySignInActivity.this, getString(R.string.query_failure)); } } }); } }
日歷小圓點裝飾,重寫 DayViewDecorator
public class EventDecorator implements DayViewDecorator { private int color; private HashSet<CalendarDay> dates; public EventDecorator(int color, Collection<CalendarDay> dates) { this.color = color; this.dates = new HashSet<>(dates); } @Override public boolean shouldDecorate(CalendarDay day) { return dates.contains(day); } @Override public void decorate(DayViewFacade view) { view.addSpan(new DotSpan(7, color)); } }
看完這篇關(guān)于Android如何實現(xiàn)百度地圖地點簽到功能的文章,如果覺得文章內(nèi)容寫得不錯的話,可以把它分享出去給更多人看到。
文章標(biāo)題:Android如何實現(xiàn)百度地圖地點簽到功能
網(wǎng)站網(wǎng)址:http://chinadenli.net/article20/jdjhjo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站制作、服務(wù)器托管、用戶體驗、建站公司、網(wǎng)站設(shè)計、品牌網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)