百度地图定位
前提
旅游回来,心中油然升起一股热血滂湃,激励自己发现市场需求,向创业奋进,朝着梦想前进。
简介
百度Android定位SDK支持Android1.5以及以上设备,提供:
- 定位功能:通过GPS、网络定位(WIFI、基站)混合定位模式,返回当前所处的位置信息
- 反地理编码功能:解析当前所处的位置坐标,获得详细的地址描述信息。
定位SDK支持多样化服务与定位策略,用户可通过设置不同的定位时间间隔、选择不同的定位服务模式、定制不同的定位结果信息来满足自身需求。
支持Android1.5及以上系统定位原理
使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。
用户可以设置满足自身需求的定位依据:
若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。
如图:定位SDK 再封装
SDK分为几个类:
LocationClient类 定位管理类
LocationClientOption类 设置定位参数
BDLocation类 位置信息封装
BDLocationListener接口类 //定位触发监听
BDNotifyListener 类 //定位提示 触发
封装如下:
public class LocationMananger extends BDNotifyListener implements
BDLocationListener {
public enum LocationEvent {
Receive, Poi
}
public enum LocationCoor {
Gcj02, // 返回国测局经纬度坐标系 coor=gcj02
Bd09, // 返回百度墨卡托坐标系 coor=bd09
Bd0911 // 返回百度经纬度坐标系 coor=bd09ll
}
private Context mContext;
private static LocationMananger mThis;
private Vibrator mVibrator;
private LocationClient mLocationClient;
private LocationClientOption mLocationClientOption;
LinkedList<IXLocationReceiveListener> mIXLocationReceiveListeners = new LinkedList<IXLocationReceiveListener>();
LinkedList<IXLocationNotifyListener> mIXLocationNotifyListeners = new LinkedList<IXLocationNotifyListener>();
public LocationMananger(Context context) {
mContext = context;
mVibrator = (Vibrator) ((Activity) mContext).getApplication()
.getSystemService(Service.VIBRATOR_SERVICE); // 控制震动
mLocationClient = new LocationClient(mContext);
onInitDefaultClientOption();
}
public static LocationMananger getInstance(Context context) {
if (mThis == null) {
return new LocationMananger(context);
}
return mThis;
}
public LocationClient getLocationClient() {
return mLocationClient;
}
@Override
public void onNotify(BDLocation mlocation, float distance) { // 位置监听 位置到达响应
// 震动 响铃
mVibrator.vibrate(1000);
onIXLocationNotifyListener(mlocation, distance);
}
@Override
public void onReceiveLocation(BDLocation bdLocation) { // 接收位置信息
onIXLocationReceiveListener(LocationEvent.Receive, bdLocation);
}
@Override
public void onReceivePoi(BDLocation bdLocation) { // 接收位置请求
onIXLocationReceiveListener(LocationEvent.Poi, bdLocation);
}
private void onInitDefaultClientOption() {
mLocationClientOption = new LocationClientOption();
mLocationClientOption.setOpenGps(true); // 打开gps
mLocationClientOption.setCoorType(getCoolType(null)); // 设置坐标类型为bd09ll
mLocationClientOption.setServiceName(mContext.getClass().toString());
mLocationClientOption.setProdName(mContext.getClass().toString());
mLocationClientOption.setPoiExtraInfo(true);
mLocationClientOption.setAddrType("all"); // 默认值为all时,表示返回地址信息。其他值都表示不返回地址信息。
mLocationClientOption.setScanSpan(3000); // 设置定位模式,小于1秒则一次定位;大于等于1秒则定时定位
mLocationClientOption.setPriority(LocationClientOption.NetWorkFirst); // 设置网络优先
mLocationClientOption.setPoiNumber(10);
mLocationClientOption.disableCache(true); // 设置是否启用缓存设定说明
mLocationClientOption.setPoiDistance(50); // 漠然十米
mLocationClient.setLocOption(mLocationClientOption);
}
public void openAddr() { // 开启返回地址信息
mLocationClientOption.setAddrType("all"); // 默认值为all时,表示返回地址信息。其他值都表示不返回地址信息。
mLocationClient.setLocOption(mLocationClientOption);
}
public void closeAddr() {// 关闭返回地址信息
mLocationClientOption.setAddrType(""); // 默认值为all时,表示返回地址信息。其他值都表示不返回地址信息。
mLocationClient.setLocOption(mLocationClientOption);
}
public void setScanSpan(int second) {
mLocationClientOption.setScanSpan(second * 1000); // 设置定位模式,小于1秒则一次定位;大于等于1秒则定时定位
mLocationClient.setLocOption(mLocationClientOption);
}
public void setPriority(boolean netPriority) {
if (netPriority) {
mLocationClientOption
.setPriority(LocationClientOption.NetWorkFirst); // 设置网络优先
} else {
mLocationClientOption.setPriority(LocationClientOption.GpsFirst); //
}
mLocationClient.setLocOption(mLocationClientOption);
}
public void setPoiDistance(int distance) {
mLocationClientOption.setPoiDistance(distance);
mLocationClient.setLocOption(mLocationClientOption);
}
public void setPoiNumber(int count) {
mLocationClientOption.setPoiNumber(count);
mLocationClient.setLocOption(mLocationClientOption);
}
public void openCache() {
mLocationClientOption.disableCache(false); // 设置是否启用缓存设定说明
mLocationClient.setLocOption(mLocationClientOption);
}
public void closeCache() {
mLocationClientOption.disableCache(true); // 设置是否启用缓存设定说明
mLocationClient.setLocOption(mLocationClientOption);
}
public void openGPS() {
mLocationClientOption.setOpenGps(true); // 打开gps
mLocationClient.setLocOption(mLocationClientOption);
}
public void closeGPS() {
mLocationClientOption.setOpenGps(false); // 打开gps
mLocationClient.setLocOption(mLocationClientOption);
}
public void setCoolType(LocationCoor coor) { // 设置类型
mLocationClientOption.setCoorType(getCoolType(coor));
mLocationClient.setLocOption(mLocationClientOption);
}
public void openPoiExtraInfo() { // 设置是否需要POI的电话地址等详细信息
mLocationClientOption.setPoiExtraInfo(true);
mLocationClient.setLocOption(mLocationClientOption);
}
public void closePoiExtraInfo() {
mLocationClientOption.setPoiExtraInfo(false);
mLocationClient.setLocOption(mLocationClientOption);
}
// IXLocationReceiveListener
public boolean addIXLocationReceiveListener(
IXLocationReceiveListener listener) {
if (hasIXLocationReceiveListener(listener))
return false;
mIXLocationReceiveListeners.add(listener);
mLocationClient.registerLocationListener(this);
return true;
}
public boolean hasIXLocationReceiveListener(
IXLocationReceiveListener listener) {
for (int i = 0; i < mIXLocationReceiveListeners.size(); i++) {
if (mIXLocationReceiveListeners.get(i) == listener)
return true;
}
return false;
}
public boolean removeIXLocationReceiveListener(
IXLocationReceiveListener listener) {
boolean bResult = false;
for (int i = 0; i < mIXLocationReceiveListeners.size(); i++) {
if (mIXLocationReceiveListeners.get(i) == listener) {
mIXLocationReceiveListeners.remove(i);
bResult = true;
}
}
if (mIXLocationReceiveListeners.size() == 0) {
mLocationClient.unRegisterLocationListener(this);
}
return bResult;
}
public void onIXLocationReceiveListener(LocationEvent event,
BDLocation bdLocation) {
for (int i = 0; i < mIXLocationReceiveListeners.size(); i++) {
mIXLocationReceiveListeners.get(i).onLocationReceive(event,
bdLocation);
}
}
// IXLocationNotifyListeners
public boolean addIXLocationNotifyListener(IXLocationNotifyListener listener) {
if (hasIXLocationNotifyListener(listener))
return false;
mIXLocationNotifyListeners.add(listener);
return true;
}
public boolean hasIXLocationNotifyListener(IXLocationNotifyListener listener) {
for (int i = 0; i < mIXLocationNotifyListeners.size(); i++) {
if (mIXLocationNotifyListeners.get(i) == listener)
return true;
}
return false;
}
public boolean removeIXLocationNotifyListener(
IXLocationNotifyListener listener) {
boolean bResult = false;
for (int i = 0; i < mIXLocationNotifyListeners.size(); i++) {
if (mIXLocationNotifyListeners.get(i) == listener) {
mIXLocationNotifyListeners.remove(i);
bResult = true;
}
}
return bResult;
}
public void onIXLocationNotifyListener(BDLocation bdLocation, float distance) {
for (int i = 0; i < mIXLocationNotifyListeners.size(); i++) {
mIXLocationNotifyListeners.get(i).onLocationNotify(bdLocation,
distance);
}
}
public static String getErrorString(int errorCode) { // BDLocation.getLocType()
if (errorCode == 61) {
return "GPS定位结果";
} else if (errorCode == 62) {
return "扫描整合定位依据失败。此时定位结果无效。";
} else if (errorCode == 63) {
return "网络异常,没有成功向服务器发起请求。此时定位结果无效。";
} else if (errorCode == 65) {
return "定位缓存的结果。";
} else if (errorCode == 66) {
return "离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果";
} else if (errorCode == 67) {
return "离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果";
} else if (errorCode == 68) {
return "网络连接失败时,查找本地离线定位时对应的返回结果";
} else if (errorCode == 161) {
return "表示网络定位结果";
} else if (errorCode >= 162 || errorCode <= 167) {
return "服务端定位失败。";
}
return "其它错误";
}
private String getCoolType(LocationCoor coor) {
if (coor == LocationCoor.Bd09) {
return "bd09";
} else if (coor == LocationCoor.Gcj02) {
return "gcj02";
} else {
return "bd09ll";
}
}
public interface IXLocationReceiveListener {
public void onLocationReceive(LocationEvent event, BDLocation bdLocation);
}
public interface IXLocationNotifyListener {
public void onLocationNotify(BDLocation bdLocation, float distance);
}
}
感言
一个类包含了它所有功能,一个程序只构造一个实例,是不是非常方便?
夜深了,我总是在想一个问题,技术永无止境,我们该如何立足社会?