单次定位:
//启动单次定位
public void initOnceSite(final OnceSiteCallBack mCallBack) {
try {
LocationClient.setAgreePrivacy(true);
final LocationClient locClientOne = new LocationClient(App.getApplication());
locClientOne.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
String mSite = location.getAddrStr();
Log.e("查看位置获取到的信息", "地址:" + mSite);
if (BaseUtils.isEmpty(mSite)) {
locClientOne.restart();
} else {
locClientOne.stop();
mCallBack.onBDLocation(location);
}
}
});
//设置定位参数
LocationClientOption option = new LocationClientOption();
//可选,设置定位模式,默认高精度 LocationMode.Hight_Accuracy:高精度;
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//设置是否进行单次定位,单次定位时调用start之后会默认返回一次定位结果
option.setOnceLocation(true);
//设置是否需要地址信息
option.setIsNeedAddress(true);
option.setIsNeedLocationDescribe(true);
//设置定位参数
locClientOne.setLocOption(option);
//开启定位
locClientOne.start();
} catch (Exception exception) {
exception.printStackTrace();
}
}
BaseUtils.isEmpty()只是一个为空的判断
LocationClient.setAgreePrivacy(true) 必须先调用以同意协议,不然定位会失败
持续定位:
这里发现一个问题,持续定位只会第一次能拿到位置信息,后面返回的全是null,通过restart()方法重新定位也是返回的null(偶发性,不绝对出现)。
目前的解决办法是停止当前定位,重新初始化位置:
public void onReceiveLocation(BDLocation location) {
String mSite = location.getAddrStr();
Log.e("查看位置获取到的信息", "连续地址:" + mSite);
if (!BaseUtils.isEmpty(mSite)) {
mCallBack.onContinuousSite(location);
} else {
locClientContinuoue.stop();
initContinuousSite(mCallBack);
}
}
重新调用后调试ok,效果如下,null第一次后面返回的(偶发性,不绝对出现)

使用方法如下:
//获取位置信息(单次)
BaiduMapUtils.getsInstance().initOnceSite(new BaiduMapUtils.OnceSiteCallBack() {
@Override
public void onBDLocation(BDLocation location) {
//拿到位置后的操作
}
});
BaiduMapUtils.getsInstance().initContinuousSite(new BaiduMapUtils.ContinuousSiteCallBack() {
@Override
public void onContinuousSite(BDLocation location) {
//连续定位后的操作
}
});
附上完整代码。对于地址null(偶发性,不绝对出现)有更好的处理方法,写在评论区参考参考
public class BaiduMapUtils {
private static BaiduMapUtils instance;
public static BaiduMapUtils getsInstance() {
synchronized (BaiduMapUtils.class) {
if (instance == null) {
instance = new BaiduMapUtils();
}
return instance;
}
}
//启动单次定位
public void initOnceSite(final OnceSiteCallBack mCallBack) {
try {
LocationClient.setAgreePrivacy(true);
final LocationClient locClientOne = new LocationClient(App.getApplication());
locClientOne.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
String mSite = location.getAddrStr();
Log.e("查看位置获取到的信息", "地址:" + mSite);
if (BaseUtils.isEmpty(mSite)) {
locClientOne.restart();
} else {
locClientOne.stop();
mCallBack.onBDLocation(location);
}
}
});
//设置定位参数
LocationClientOption option = new LocationClientOption();
//可选,设置定位模式,默认高精度 LocationMode.Hight_Accuracy:高精度;
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
//设置是否进行单次定位,单次定位时调用start之后会默认返回一次定位结果
option.setOnceLocation(true);
//设置是否需要地址信息
option.setIsNeedAddress(true);
option.setIsNeedLocationDescribe(true);
//设置定位参数
locClientOne.setLocOption(option);
//开启定位
locClientOne.start();
} catch (Exception exception) {
exception.printStackTrace();
}
}
//启动连续定位
public void initContinuousSite(final ContinuousSiteCallBack mCallBack) {
try {
LocationClient.setAgreePrivacy(true);
final LocationClient locClientContinuoue = new LocationClient(App.getApplication());
locClientContinuoue.registerLocationListener(new BDAbstractLocationListener() {
@Override
public void onReceiveLocation(BDLocation location) {
String mSite = location.getAddrStr();
Log.e("查看位置获取到的信息", "连续地址:" + mSite);
if (!BaseUtils.isEmpty(mSite)) {
mCallBack.onContinuousSite(location);
} else {
locClientContinuoue.stop();
initContinuousSite(mCallBack);
}
}
});
//设置连续定位参数
LocationClientOption longOption = new LocationClientOption();
// 如果设置为0,则代表单次定位,即仅定位一次,默认为0
// 如果设置非0,需设置1000ms以上才有效
longOption.setScanSpan(10 * 1000);
//设置是否需要地址信息
longOption.setIsNeedAddress(true);
longOption.setIsNeedLocationDescribe(true);
// 设置定位参数
locClientContinuoue.setLocOption(longOption);
// 开启定位
locClientContinuoue.start();
} catch (Exception exception) {
exception.printStackTrace();
}
}
//单次定位的回调
public interface OnceSiteCallBack {
void onBDLocation(BDLocation location);
}
//连续定位的回调
public interface ContinuousSiteCallBack {
void onContinuousSite(BDLocation location);
}
}