百度地图定位
前提
旅游回来,心中油然升起一股热血滂湃,激励自己发现市场需求,向创业奋进,朝着梦想前进。
简介
百度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); } }
感言
一个类包含了它所有功能,一个程序只构造一个实例,是不是非常方便?
夜深了,我总是在想一个问题,技术永无止境,我们该如何立足社会?