前面已经实现了利用百度地图进行定位的功能,定位只是一个基本的依托,现在我们可以利用它来做更多的东西,例如位置提醒服务。在定位API的模块中,BDMap 还提供了一个地理围栏服务的板块,但是正如它里面介绍所说,目前只是一个Beta版本,博主登录过百度LBS的开放平台论坛,看到上面所提及到的Bug仍然存在很多,所以这里不作这方面的介绍。在API当中,里面有一个位置提醒使用的介绍,本篇主要介绍这个功能。值得注意的是,这里为了显现定位提醒功能实现成功,在提醒服务里面增加了一个手机震动的功能。
一、实现位置提醒功能:
public class MainActivity<NotifyLister> extends Activity {
...
public NotifyLister mNotifyer = null;//增加一个位置提醒的变量
...
protected void onCreate(Bundle savedInstanceState) {
...
initNotify();//使用一个定位提醒的函数,可以清晰分辨,下面会进行定义
...
}
//位置提醒相关代码
private void initNotify() {
mNotifyer = new NotifyLister();//定义位置提醒变量
mNotifyer.SetNotifyLocation(latitude,longtitude,distance,"bd09ll");
//4个参数代表要位置提醒的点的坐标,具体含义依次为:纬度,经度,距离范围,坐标系类型 (gcj02,gps,bd09,bd09ll)
mLocationClient.registerNotify(mNotifyer);
//注册位置提醒监听事件后,可以通过SetNotifyLocation俩修改位置提醒设置,修改后立刻生效
}
//BDNotifyListener:位置提醒接口类,用于设定位置提醒
public class NotifyLister extends BDNotifyListener{
/**
* onNotify(...): 位置提醒监听事件具体实现
* mlocation表示当前位置,
* distance是当前坐标中心点与设定位置提醒的坐标点之间的距离值。
*/
public void onNotify(BDLocation mlocation, float distance){
//监听范围内所做的提醒功能
}
}
...
}
这样,基本的位置提醒服务已经完成,接下来要实现的是,在监听范围内所要做的动作(这里实现的是手机震动功能)。
二、实现提醒范围内的手机震动功能:
-
首先,要在AndroidManifest.xml文件中添加允许手机震动的权限:
<uses-permission android:name="android.permission.VIBRATE" />
-
接下来就可以直接在主java文件中编辑添加震动代码:
public class MainActivity<NotifyLister> extends Activity {
...
private Vibrator mVibrator;//添加控制手机震动的变量
private long[] mTips = {1000,2000,1000,2000};//添加一个long型的数组,用来记录震动频率
...
protected void onCreate(Bundle savedInstanceState) {
...
mVibrator = (Vibrator) this.getSystemService(VIBRATOR_SERVICE);
//给震动变量定义成一个手机可以提供的震动服务
...
}
public class NotifyLister extends BDNotifyListener{
public void onNotify(BDLocation mlocation, float distance){
mVibrator.vibrate(mTips, -1);
//在提醒范围内增加手机震动功能,第一个参数定义震动频率,第二个参数定义震动的次数
}
}
以上已经基本实现了BDMap所提供的位置提醒服务功能,但是有一点值得注意的是,在
mNotifyer.SetNotifyLocation(latitude,longtitude,distance,"bd09ll");
代码里面的参数,distance距离是以m作单位,但是前面两个是以百度坐标的经纬度作参数,在计算的时候不能简单的作加减,要在经纬度和距离作转换才可以直观地计算。幸好,在BDMap所提供的API中,也有一个可以实现经纬度和距离作转换的实现方式:
LatLng p1 = new LatLng(x1, y1);//p1存放第一个点的经纬度,这里的x1,y1是经纬度,下同
LatLng p2 = new LatLng(x2, y2);//p2存放第二个点的经纬度
double distance = DistanceUtil.getDistance(p1, p2);//求两点间的距离,单位是m
这里在应用DistanceUtil.getDistance()的时候要注意,自己是否已经下载了定位的计算工具SDK。