高德地图定位是常见的API使用,下面我们开始学习利用高德地图设置一个定位插件,来为我们的地图程序提供定位服务。首先明确一点,定位是一个耗时的过程,我们在启动api的定位服务时不能立即获取到位置信息,那我们就必须是用监听器来进行监听。下面请看代码:
public class LocationGaoDe {
public static LocationGaoDe local;//全局静态实例.
private LocationManagerProxy mLocationManagerProxy;//高德地图api管理接口
LocationListener listener;
String location;//返回的位置字段和经纬度
private double Y;//纬度
private double X;//经度
boolean find=false;//查询结果.
public static LocationGaoDe getInstances(){
// 获取定位插件的单实例
if (null == local) {
local = new LocationGaoDe();
}
return local;
}
public String getLocal(){//定位方法,注意该方法并不一定能立刻获取位置信息.
mLocationManagerProxy = LocationManagerProxy.getInstance(MyApplication.getInstance());
mLocationManagerProxy.setGpsEnable(false);
listener=new LocationListener();
location="";//每次都初始化为空
// 此方法为每隔固定时间会发起一次定位请求,为了减少电量消耗或网络流量消耗,
// 注意设置合适的定位时间的间隔(最小间隔支持为2000ms),并且在合适时间调用removeUpdates()方法来取消定位请求
// 在定位结束后,在合适的生命周期调用destroy()方法
// 其中如果间隔时间为-1,则定位只定一次,
//在单次定位情况下,定位无论成功与否,都无需调用removeUpdates()方法移除请求,定位sdk内部会移除
onGetLocation l=new onGetLocation(){//构造一个监听器类。
@Override
public void get() {//成功的时候将定位信息写入sp中
SharedPreferenceUtil.setInfoToShared("Longitude",String.valueOf(Y));
SharedPreferenceUtil.setInfoToShared("Latitude",String.valueOf(X));
SharedPreferenceUtil.setInfoToShared("Location",location);
}
@Override
public void fail() {//失败的时候作为0默认值
SharedPreferenceUtil.setInfoToShared("Longitude","0");
SharedPreferenceUtil.setInfoToShared("Latitude","0");
SharedPreferenceUtil.setInfoToShared("Location","");
}
};
listener.L=l;//设置定位服务的监听
mLocationManagerProxy.requestLocationData(LocationProviderProxy.AMapNetwork,-1, 17, listener);//开启定位服务
return location;
}
public class LocationListener implements AMapLocationListener{//定位监听器,用于监听位置定位.
public onGetLocation L;//设置一个监听对象,用于定位成功或者失败.
@Override
public void onLocationChanged(Location arg0) {
}
@Override
public void onProviderDisabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String arg0) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String arg0, int arg1, Bundle arg2) {
// TODO Auto-generated method stub
}
@Override
public void onLocationChanged(AMapLocation arg0) {
if (arg0!=null&&arg0.getAMapException().getErrorCode() == 0) {
// 定位成功回调信息,设置相关消息
Y=arg0.getLongitude();//经度
X=arg0.getLatitude();//纬度
location=arg0.getAddress();
mLocationManagerProxy.removeUpdates(listener);//注销监听器回收资源.
L.get();//定位成功回调,用于把信息传递出去
}
else if(arg0!=null&&arg0.getAMapException().getErrorCode()!= 0){
L.fail();//定位失败.
}
}
}
public interface onGetLocation{//监听器,代码的关键部分.在定位失败或者成功的时候调用监听器类的回调方法
public abstract void get();//定位成功时调用
public abstract void fail();//定位失败
}
public String getY(){
String y=SharedPreferenceUtil.getInfoFromShared("Longitude","0");//经度
return y;
}
public String getX(){
String x=SharedPreferenceUtil.getInfoFromShared("Latitude","0");//纬度
return x;
}
public String getLocation(){
String lo=SharedPreferenceUtil.getInfoFromShared("Location","");//位置.
return lo;
}
}
这样我们就可以在app启动的时候通过LocationGaoDe.getInstances().getLocal() ;的方式进行定位了.当程序从启动页到主界面的时候有足够的时间进行定位操作.这样我们通过三个get方法就能得到定位数据了