由于项目需求,APP里进入一个模块里,只需要获取到我当前的地理位置(经纬度),而不需要进入到地图中去。辣么问题来了,在之前写的那个工具类中有用到baiduMap,需要在XML文件中添加MapView,但是我们定位是不需要这些东西的。其实这里可以去对mapView进行一个判空来解决,但是这样会使得工具类很难用,于是我把其中的一些代码抽出来,重新写了一个工具类,专门用于定位,不需要bauduMap。但是在使用的时候,发现一个问题:由于我项目中是从含地图的Activity跳转到一个只需要定位的Activity中去,由于在含地图的Acitivyt注册了监听器,在跳进不含地图但是要定位的Activity里去时,当你定位的时候,百度回调时,还是会继续回调给上一个Activity,然后MapView等都有了上一个Activity的值。而且回调的时候还会继续给上一个回调,而我们需要的这个只定位的Acitivyt反而有时候收不到回调。于是我做出了修改,
具体如下:
/**
* 当前地理坐标
*/
private LatLng mLoactionLatLng;
public LocationClient mLocationClient;
public String locationProvider="0.0,0.0" ;
public String locationPos ;
private Dialog fDialog, failDialog;
private TextView txt_Yes, txt_No,txt_fail_Yes,txt_fail_No;
private Context context;
private CallBack mCallBack;
public boolean isPosition=false;
public String getLocationProvider() {
return locationPos;
}
public void setCallBack(CallBack mCallBack) {
this.mCallBack = mCallBack;
}
public MapPositionUtil(Context context){
this.context=context;
}
// 地图
public void initSettingMapViews() {
if (isPosition==false){
isPosition=true;
}
// 定位初始化
if (mLocationClient==null){
mLocationClient=new LocationClient(context);
}
// 定位到我的位置
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);// 打开gps
option.setCoorType(CoordinateType.BD09LL); // 设置坐标类型
option.setScanSpan(900); // 设置只定位一次
mLocationClient.setLocOption(option);
mLocationClient.start(); // 开启定位
}
// 定位监听器
private class MyBDLocationListner implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
// 定位当前的地点
double mLantitude = location.getLatitude();
double mLongtitude = location.getLongitude();
locationProvider = mLongtitude + "," + mLantitude;
mLoactionLatLng = new LatLng(mLongtitude, mLantitude);
// 判断是否获取成功
if (isLnglat(locationProvider)) { // 获取成功
Toast.makeText(context,"定位成功", Toast.LENGTH_SHORT).show();
if (mCallBack!=null) {
//定到的位置局中心
LatLng ll = new LatLng(location.getLatitude(),
location.getLongitude());
MapStatusUpdate uu = MapStatusUpdateFactory.newLatLngZoom(ll,14.0f);//1公里
mCallBack.getGPS(locationProvider);
}
} else if (locationProvider.equals("0.0,0.0")
|| !isLnglat(locationProvider)) { // 获取失败
failDialog(); // 获取失败弹框获取提示是否重新定位
}
}
}
// 判断是否是经纬度正则表达式
public boolean isLnglat(String ss) {
String reg = "^[0-9]{3}\\.[0-9]+\\,[0-9]{2}\\.[0-9]+$";
return ss.matches(reg);
}
// 地理位置信息获取成功弹出Dialog
public void promptDialog() {
fDialog=new Dialog(context);
fDialog.setTitle("系统信息");
fDialog.setCancelable(false);
View myv = LayoutInflater.from(context).inflate(R.layout.item_map_position_prompt_dialog
, null);
fDialog.setContentView(myv);
txt_Yes = (TextView) myv.findViewById(R.id.txt_Yes);
txt_No = (TextView) myv.findViewById(R.id.txt_No);
txt_Yes.setOnClickListener(new DialogClick());
txt_No.setOnClickListener(new DialogClick());
fDialog.show(); // 暂放
}
// 地理位置信息获取失败弹出Dialog
public void failDialog() {
failDialog=new Dialog(context);
failDialog.setTitle("系统信息");
failDialog.setCancelable(false);
View myv = LayoutInflater.from(context).inflate(
R.layout.item_failure_main_prompt_dialog, null);
failDialog.setContentView(myv);
txt_fail_Yes = (TextView) myv.findViewById(R.id.txt_fail_Yes);
txt_fail_No = (TextView) myv.findViewById(R.id.txt_fail_No);
txt_fail_Yes.setOnClickListener(new DialogClick());
txt_fail_No.setOnClickListener(new DialogClick());
failDialog.show(); // 暂放
}
// 弹窗的点击事件
class DialogClick implements View.OnClickListener {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
switch (arg0.getId()) {
case R.id.txt_fail_Yes:
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
failDialog.dismiss();
initSettingMapViews(); // 重新取定位
}
});
break;
case R.id.txt_fail_No:
failDialog.dismiss();
break;
default:
break;
}
}
}
//获取到定位的回调
public interface CallBack{
void getGPS(String gps);
}
这里可以看到,这里与上一篇中有MapView的那个工具类其实是差不多的,只是把对MapView与baiduMap的相关代码删除了。但是!!!我们上面没有了mLocationClient绑定的监听器的方法,因为我增加了这两个方法:registerLocationListener()和unregisterLocationListener():
MyBDLocationListner myBDLocationListner=new MyBDLocationListner();
/**
* 注册监听,定位到我的位置
*/
public void registerLocationListener(){
if (mLocationClient==null){
mLocationClient=new LocationClient(context);
}
mLocationClient.registerLocationListener(myBDLocationListner);
}
/**
* 取消监听
*/
public void unregisterLocationListener(){
mLocationClient.unRegisterLocationListener(myBDLocationListner);
}
我把注册监听的单拎出来写了两个方法,他们在Activity的onPause()和onResume()方法中调用:
@Override
public void onPause() {
super.onPause();
mapPositionUtil.unregisterLocationListener();//取消监听
}
@Override
protected void onResume() {
super.onResume();
mapPositionUtil.registerLocationListener();//注册监听
}
上面这两行代码非常关键,要取消注册,然后再给我们新跳入的Activity进行注册。这样就不会继续给上一个Activity回调了,也节省了资源。
那么当重新定位的时候,只需要在Activity里判定一下isPosition就可以了
if (mapPositionUtil.isPosition==true) {
mapPositionUtil.mLocationClient.requestLocation();//重新定位
} else {
mapPositionUtil.initSettingMapViews();//开始定位
}
以上就是关于百度地图,只需要定位,获取经纬度的方法