赞
踩
文章来自:http://blog.csdn.net/intbird
如果定位结果为网络定位,已包含地址具体信息,直接保存结果,标记为网络定位
如果是gps定位信息,则只有经纬度,进行反地理编码,保存具体信息结果,标记为网络定位
如果长时间取不到位置,则由定时器计时指定时间返回上次位置,也就是最长8s返回定位,标记为定时器返回
如果始终没有取到位置,那么返回(0,0) ,并且后台再次获取位置,直到位置有效或者超出次数限制而停止
多次返回去重:如需要处理位置的重复返回多次,根据类型去获取Map中上次该类型的信息,对比,主要判断该类型的时间间隔,精度纬度偏差等等
地图上没有自带的定位方式,即地图和定位是独立的,可以让任意的位置信息放入 我的位置 上,也可以用高德地图,用百度定位,让使用中的地图去显示小蓝点,当然也可以是自己定位的任意样式;
-百度定位:定位类型可以默认就很好;
在startLocation()时貌似会返回两次定位结果,request好像是返回一次结果,百度定位的时间联网时时网络时间,时间格式是字符串,在网络定位时会返回具体信息,如果是断网情况下,返回当前手机时间,不定位不耗电,定位经纬度位数比较短;
-高德地图:定位类型有三种,AmapNetWork即可,request(),应该和系统定位是一致的,返回时间为当前手机时间,如果没有订到位置,getLastKnow为上一次定位时间,lbs包含更多信息,定位经纬度位数比较长;
-系统定位:定位类型有三种,network,gps,passive,在室内使用返回成功几乎不可能,在网络定位还好,
BDLocationManager.java
GDLocationManager.java
MyAppLocation.java;
MyAppLocationListener.java;
注意使用的经纬度类型问题,由于涉及业务,Utils里两个文件不贴出来.定位本来就很简单,就是处理封装一下保证应用的位置准确和速度.有需要后台监控位置变化的,这里不做介绍.
1. BDLocationManager.java
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
/**
* 百度定位5.1
* @author intbird
*
*/
public class BDLocationManager {
private static BDLocationManager instance = null;
private static final int timeOutLocation = 8*1000;
private static final int timeSpanLocation= 500;//单次定位
public LocationClient mLocationClient;
private MyBDLocationListener mBDLocationListener;
private MyAppLocationListener myAppListener;
public static BDLocationManager getInstance(){
if (instance == null){
instance = new BDLocationManager();
}
return instance;
}
private BDLocationManager(){
super();
//定位初始化
mLocationClient = new LocationClient(AppContext.getInstance().getApplicationContext());
mBDLocationListener = new MyBDLocationListener();
mLocationClient.registerLocationListener(mBDLocationListener);
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);//打开gps
option.setAddrType("all");
option.setCoorType("bd09ll"); //设置坐标类型
option.setScanSpan(timeSpanLocation);
option.setTimeOut(timeOutLocation);
mLocationClient.setLocOption(option);
}
public void start(MyAppLocationListener listener){
this.myAppListener = listener;
if (mLocationClient != null){
if(mLocationClient.isStarted()){
mLocationClient.requestLocation();
}else{
mLocationClient.start();
}
}
}
public void destroy(){
//mLocationClient.stop();
//mLocationClient.unRegisterLocationListener(mBDLocationListener);
}
private class MyBDLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location) {
if(location==null) return;
int locType = location.getLocType();
if(locType==BDLocation.TypeGpsLocation ||
locType==BDLocation.TypeNetWorkLocation||
locType==BDLocation.TypeOffLineLocation||
locType==BDLocation.TypeCacheLocation ){
MyAppLocation.getInstance().onLocationSussess(location, myAppListener);
destroy();
}else{
MyAppLocation.getInstance().onLocationedFaild(myAppListener);
if(locType==BDLocation.TypeServerError){
MyToast.showToast(Frame.getInstance().getAppContext(),"定位失败,请允许使用位置服务");
}
}
}
};
public BDLocation getLastKnowLocation(){
if(mLocationClient!=null){
return mLocationClient.getLastKnownLocation();
}
return null;
}
}

import android.location.Location;
import and
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。