溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Android如何實(shí)現(xiàn)百度地圖地點(diǎn)簽到功能

發(fā)布時(shí)間:2020-08-04 14:42:46 來源:億速云 閱讀:309 作者:小豬 欄目:移動(dòng)開發(fā)

小編這次要給大家分享的是Android如何實(shí)現(xiàn)百度地圖地點(diǎn)簽到功能,文章內(nèi)容豐富,感興趣的小伙伴可以來了解一下,希望大家閱讀完這篇文章之后能夠有所收獲。

前言:先寫個(gè)簡(jiǎn)單的地點(diǎn)簽到功能,如果日后有時(shí)間細(xì)寫的話,會(huì)更加好好研究一下百度地圖api,做更多邏輯判斷。

這里主要是調(diào)用百度地圖中的場(chǎng)景定位中的簽到場(chǎng)景。通過官方文檔進(jìn)行api集成。通過GPS的定位功能,獲取地理位置,時(shí)間,用戶名進(jìn)行存儲(chǔ)。之后通過日歷顯示歷史簽到記錄。

效果圖:

Android如何實(shí)現(xiàn)百度地圖地點(diǎn)簽到功能

Android如何實(shí)現(xiàn)百度地圖地點(diǎn)簽到功能 Android如何實(shí)現(xiàn)百度地圖地點(diǎn)簽到功能

 /**百度地圖sdk**/
 implementation files('libs/BaiduLBS_Android.jar')
 /**日歷選擇器**/
 implementation 'com.prolificinteractive:material-calendarview:1.4.3'

 簽到布局:

<&#63;xml version="1.0" encoding="utf-8"&#63;>
<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);
  // 注冊(cè)監(jiān)聽
  mLocationService.registerListener(mListener);
  LocationClientOption option = mLocationService.getOption();
  // 簽到場(chǎng)景 只進(jìn)行一次定位返回最接近真實(shí)位置的定位結(jié)果(定位速度可能會(huì)延遲1-3s)
  option.setLocationPurpose(LocationClientOption.BDLocationPurpose.SignIn);
  // 設(shè)置定位參數(shù)
  mLocationService.setLocationOption(option);
 }
 
 
 /*****
  *
  * 定位結(jié)果回調(diào),重寫onReceiveLocation方法
  *
  */
 private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {
 
  /**
   * 定位請(qǐng)求回調(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();
  }
 }
}

歷史簽到布局

<&#63;xml version="1.0" encoding="utf-8"&#63;>
<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));
    }
   }
  });
 }
 
}

日歷小圓點(diǎn)裝飾,重寫 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如何實(shí)現(xiàn)百度地圖地點(diǎn)簽到功能的文章,如果覺得文章內(nèi)容寫得不錯(cuò)的話,可以把它分享出去給更多人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI