Android项目实战之百度地图地点签到功能

时间:2022-07-27
本文章向大家介绍Android项目实战之百度地图地点签到功能,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

前言:先写个简单的地点签到功能,如果日后有时间细写的话,会更加好好研究一下百度地图api,做更多逻辑判断。

这里主要是调用百度地图中的场景定位中的签到场景。通过官方文档进行api集成。通过GPS的定位功能,获取地理位置,时间,用户名进行存储。之后通过日历显示历史签到记录。

效果图:

 /**百度地图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 style="@style/horizontal_line_style" / 
<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"
style="@style/style_button"
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();
}
/**
* 查询今日签到状态
*/
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);
// 注册监听
mLocationService.registerListener(mListener);
LocationClientOption option = mLocationService.getOption();
// 签到场景 只进行一次定位返回最接近真实位置的定位结果(定位速度可能会延迟1-3s)
option.setLocationPurpose(LocationClientOption.BDLocationPurpose.SignIn);
// 设置定位参数
mLocationService.setLocationOption(option);
}
/*****
*
* 定位结果回调,重写onReceiveLocation方法
*
*/
private BDAbstractLocationListener mListener = new BDAbstractLocationListener() {
/**
* 定位请求回调函数
*
* @param location 定位结果
*/
@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(); //获取详细地址信息
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:
}
}
/**
* 更新签到数据
* @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));
}
}
});
}
/**
* 保存签到数据
* @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;
}
//签到只需调用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
style="@style/horizontal_line_style"/ 
<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));
}
}

总结

到此这篇关于Android项目实战之地点签到功能(百度地图)的文章就介绍到这了,更多相关android 地点签到内容请搜索ZaLou.Cn以前的文章或继续浏览下面的相关文章希望大家以后多多支持ZaLou.Cn!