Android项目实战之百度地图地点签到功能
项目实战之百度地图地点签到功能
主要介绍了Android项目实战之百度地图地点签到功能,本文通过实例代码给大家介绍的非常详细,对大家的学
习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
前言:先写个简单的地点签到功能,如果日后有时间细写的话,会更加好好研究一下百度地图api,做更多逻辑判断。
这里主要是调用百度地图中的场景定位中的签到场景。通过官方文档进行api集成。通过GPS的定位功能,获取地理位置,时
间,用户名进行存储。之后通过日历显示历史签到记录。
效果图:
/**百度地图sdk**/
implementation files('libs/BaiduLBS_Android.jar')
/**日历选择器**/
implementation 'com.prolificinteractive:material-calendarview:1.4.3'
签到布局:
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
() {
@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();
}
}
}
历史签到布局
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" />
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 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 signInBmobQuery = new BmobQuery();
signInBmobQuery.addWhereEqualTo("username", myUser.getUsername());
signInBmobQuery.findObjects(new FindListener() {
@Override
public void done(List 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 signInBmobQuery = new BmobQuery();
signInBmobQuery.addWhereEqualTo("username", myUser.getUsername());
signInBmobQuery.addWhereEqualTo("date", FormatUtils.getDateTimeString(calendar.getTime(), FormatUtils.template_Date));
signInBmobQuery.findObjects(new FindListener() {
@Override
public void done(List 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 dates;
public EventDecorator(int color, Collection 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 地点签到内容请搜索我们
以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!