百度地图定位

前提

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

简介

百度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);
}
}
感言
一个类包含了它所有功能,一个程序只构造一个实例,是不是非常方便?
夜深了,我总是在想一个问题,技术永无止境,我们该如何立足社会?

下载

百度地图定位SDK 之构想的更多相关文章

  1. 我的Android进阶之旅------>Android百度地图定位SDK功能学习

    因为项目需求,需要使用百度地图的定位功能,因此去百度地图开发平台下载了百度地图的Android定位SDK最新版本的开发包和示例代码学习. Android 定位SDK地址:http://develope ...

  2. Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK

    原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  3. 【百度地图-安卓SDK】从头开始写android程序

    [百度地图-安卓SDK]从头开始写android程序首先确保有这四个文件    安装jdk先安装android开发SDK(并不只是为eclipse服务的),即运行installer_r15-windo ...

  4. 百度地图 Android SDK - Hello Baidu Map

    例如,给广大以下主要开发者介绍了如何使用百度地图Android SDK构造的主应用程序的地图! 第一步.创建Androidproject,将百度地图Android SDK的开发包导入到project对 ...

  5. Android使用百度地图定位并显示手机位置后使用前置摄像头“偷拍”

    今天老板让我验证一下技术可行性,记录下来. 需求 :定位手机的位置并在百度地图上显示,得到位置后使用前置摄像头进行抓拍 拿到这个需求后,对于摄像头的使用不太熟悉,于是我先做了定位手机并在百度地图上显示 ...

  6. 发现最新版百度Android 定位SDK v6.1.3 网络定位bug

    对于百度地图已经实在忍无可忍了,实验室两年以前的一个项目用到了百度地图,以前师兄毕业了,我来维护这个破项目,百度地图推出新版本出来后,老版本的api不能用了,不能做到向下兼容吗?换掉少量的api也就算 ...

  7. Android 百度地图定位(手动+自动) 安卓开发教程

    近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的.我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置.  经过2天研究 ...

  8. 百度地图 Android SDK - 检索功能使用的简单演示样例

    百度地图 SDK 不仅为广大开发人员提供了炫酷的地图展示效果.丰富的覆盖物图层,更为广大开发人员提供了多种 LBS 检索的能力. 通过这些接口,开发人员能够轻松的訪问百度的 LBS 数据,丰富自己的移 ...

  9. 百度地图 iOS SDK - 坐标转换方法

    百度地图 Android SDK 要么 iOS SDK 或各种 API 工具产品,我们使用百度自己的加密坐标系. 员在使用过程中,位置点都是通过 GPS 或者其它途径获取的.所以与百度地图所使用的坐标 ...

随机推荐

  1. javascript中类的属性研究

    原文:javascript中类的属性研究 本篇文章主要针对javascript的属性进行分析,由于javascript是一种基于对象的语言,本身没有类的概念,所以对于javascript的类的定义有很 ...

  2. crm创建和编辑全局选项集

    一个选项集就是可包含在一个实体中的某种类型的字段.它定义一组选项.当一个选项集显示在窗口中时,将使用下拉列表控件.当在 Advanced Find 中显示时,则使用选择列表控件.有时,开发者将选项集称 ...

  3. Mvc 6 中创建 Web Api

    如何在Mvc 6 中创建 Web Api以及如何脱离IIS实现自我托管 微软推出的Asp.net vNext(asp.net 5.0)的其中的一个目标就是统一mvc 和web api 的框架.接下来我 ...

  4. SQL点滴4—筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息

    原文:SQL点滴4-筛选数据列的类型,字段大小,是否可为空,是否是主键,约束等等信息 项目需要将Access数据库中的数据导入到SQL Server中,需要检验导入后的数据完整性,数据值是否正确.我们 ...

  5. 用lucene.net根据关键字检索本地word文档

    目前在做一个winform小软件,其中有一个功能是能根据关键字检索本地保存的word文档.第一次是用com读取word方式(见上一篇文章),先遍历文件夹下的word文档,读取每个文档时循环关键字查找, ...

  6. SQL Server之记录筛选(top、ties、offset)汇总

    一.TOP 筛选 如果有 ORDER BY 子句,TOP 筛选将根据排序的结果返回指定的行数.如果没有 ORDER BY 子句,TOP 筛选将按照行的物理顺序返回指定的行数. 1. 返回指定数目的行 ...

  7. Web前端框架与类库

    Web前端框架与类库的思考 说起前端框架,我也是醉了.现在去面试或者和同行聊天,动不动就这个框架碉堡了,那个框架好犀利. 当然不是贬低框架,只是有一种杀鸡焉用牛刀的感觉.网站技术是为业务而存在的,除此 ...

  8. android shape总结 和控制的风格定制

    1:shape总结 1):shape文件是放置在drawable文件下的.res/drawable/filename.xml. 2):shape类型:android:shape. 一共同拥有四种:re ...

  9. ps入门教程:画笔工具、铅笔工具、渐变工具等的使用

    本节课程主要内容:学习画笔工具.铅笔工具.颜色替换工具.历史记录画笔工具.历史记录艺术画笔工具.渐变工具和油漆桶 工具的应用.------------------------------------- ...

  10. C# 中参数验证方式

    C# 中参数验证方式 一般在写方法的时候,第一步就是进行参数验证,这也体现了编码者的细心和缜密,但是在很多时候这个过程很枯燥和乏味,比如在拿到一个API设计文档的时候,通常会规定类型参数是否允许为空, ...