博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
百度地图定位SDK 之构想
阅读量:6199 次
发布时间:2019-06-21

本文共 8604 字,大约阅读时间需要 28 分钟。

百度地图定位

前提

 从香港旅游回来,心中油然升起一股热血滂湃,激励自己发现市场需求,向创业奋进,朝着梦想前进。

简介

百度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
mIXLocationReceiveListeners = new LinkedList
(); LinkedList
mIXLocationNotifyListeners = new LinkedList
(); 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); }}

 

 

感言
一个类包含了它所有功能,一个程序只构造一个实例,是不是非常方便?
夜深了,我总是在想一个问题,技术永无止境,我们该如何立足社会?
下载

 

 

你可能感兴趣的文章
JavaOOP-继承
查看>>
android开发小内容
查看>>
MySQL无损复制(转)
查看>>
How to:如何让Installshield显示正确的软件所需空间--网友冰块先生贡献
查看>>
网络字节序、主机字节序以及大小端的问题
查看>>
Windows Azure Web Site最酷的五个特性
查看>>
Mac OS X 10.8.4下面XZ Utils(*.tar.xz)压缩解压缩命令工具的安装
查看>>
百度笔试题:malloc/free与new/delete的区别
查看>>
中小网站如何使用谷歌Adsence国际化优势赚钱?
查看>>
目标检测算法之YOLOv1与v2
查看>>
Linux: Bash基本命令
查看>>
解决nginx [error] open() "usr/local/nginx/logs/nginx.pid" failed错误
查看>>
Node.js的事件轮询Event Loop原理
查看>>
js drag拖动效果
查看>>
Javascript 执行上下文
查看>>
总结系列_10(Android开发总结,续...)
查看>>
pefile解析PE格式
查看>>
KVM主机迁移
查看>>
jsonp
查看>>
权限控制 模式
查看>>