Android 百度地图开发(二)

这一篇文章主要讲解的是百度地图的定位功能,然后还有MyLocationOverlay和PopupOverlay两个地图覆盖物的使用,Overlay是“图层”或“覆盖物”的意思,MyLocationOverlay从名字上面理解就是我的位置图层,他能够实现在地图上显示当前位置的图标以及指南针,MyLocationOverlay只负责显示我的位置,位置数据请使用百度定位SDK获取,将获取的位置数据放在一个LocationData结构中并用该结构设置MyLcationOverlay的数据源,即可创建MyLocationOverlay,PopupOverlay就是弹出窗口图层了,跟PopupWindow类似的东西,下面会介绍他们的使用方法

定位我们使用的是百度 Android 定位SDKv4.0,我们先了解下定位原理和定位精度

定位原理

使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。

用户可以设置满足自身需求的定位依据:

若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。

定位精度

了解了百度定位的原理和定位精度之后,接下来我们就来使用百度定位SDKv4.0吧

一 . 导入库文件

在使用百度定位SDKv4.0之前,我们要下载最新的库文件,下载地址:点击下载相关库文件,将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.0.jar文件拷贝到工程的libs目录下

二 . 布局文件,一个百度地图控件,加一个手动点击实现定位的按钮,放在一个相对布局里面,很简单的布局

[html] view
plain
copy

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="fill_parent" >
  5. <com.baidu.mapapi.map.MapView
  6. android:id="@+id/bmapView"
  7. android:layout_width="fill_parent"
  8. android:layout_height="fill_parent"
  9. android:clickable="true" />
  10. <Button
  11. android:id="@+id/request"
  12. android:layout_width="wrap_content"
  13. android:layout_height="wrap_content"
  14. android:layout_alignParentRight="true"
  15. android:layout_alignParentTop="true"
  16. android:layout_marginRight="10dp"
  17. android:layout_marginTop="10dip"
  18. android:background="@drawable/custom_loc"  />
  19. </RelativeLayout>

三 . 界面MainActivity代码,先贴上,然后适当讲解相关代码,我注释也比较清楚

[java] view
plain
copy

  1. package com.example.baidumapdemo;
  2. import android.app.Activity;
  3. import android.graphics.Bitmap;
  4. import android.os.Bundle;
  5. import android.util.Log;
  6. import android.view.LayoutInflater;
  7. import android.view.View;
  8. import android.view.View.MeasureSpec;
  9. import android.view.View.OnClickListener;
  10. import android.widget.Button;
  11. import android.widget.TextView;
  12. import android.widget.Toast;
  13. import com.baidu.location.BDLocation;
  14. import com.baidu.location.BDLocationListener;
  15. import com.baidu.location.LocationClient;
  16. import com.baidu.location.LocationClientOption;
  17. import com.baidu.mapapi.BMapManager;
  18. import com.baidu.mapapi.MKGeneralListener;
  19. import com.baidu.mapapi.map.LocationData;
  20. import com.baidu.mapapi.map.MKEvent;
  21. import com.baidu.mapapi.map.MapController;
  22. import com.baidu.mapapi.map.MapView;
  23. import com.baidu.mapapi.map.MyLocationOverlay;
  24. import com.baidu.mapapi.map.PopupClickListener;
  25. import com.baidu.mapapi.map.PopupOverlay;
  26. import com.baidu.platform.comapi.basestruct.GeoPoint;
  27. public class MainActivity extends Activity {
  28. private Toast mToast;
  29. private BMapManager mBMapManager;
  30. private MapView mMapView = null;
  31. private MapController mMapController = null;
  32. /**
  33. * 定位SDK的核心类
  34. */
  35. private LocationClient mLocClient;
  36. /**
  37. * 用户位置信息
  38. */
  39. private LocationData mLocData;
  40. /**
  41. * 我的位置图层
  42. */
  43. private LocationOverlay myLocationOverlay = null;
  44. /**
  45. * 弹出窗口图层
  46. */
  47. private PopupOverlay mPopupOverlay  = null;
  48. private boolean isRequest = false;//是否手动触发请求定位
  49. private boolean isFirstLoc = true;//是否首次定位
  50. /**
  51. * 弹出窗口图层的View
  52. */
  53. private View mPopupView;
  54. private BDLocation location;
  55. @Override
  56. protected void onCreate(Bundle savedInstanceState) {
  57. super.onCreate(savedInstanceState);
  58. //使用地图sdk前需先初始化BMapManager,这个必须在setContentView()先初始化
  59. mBMapManager = new BMapManager(this);
  60. //第一个参数是API key,
  61. //第二个参数是常用事件监听,用来处理通常的网络错误,授权验证错误等,你也可以不添加这个回调接口
  62. mBMapManager.init("7ae13368159d6a513eaa7a17b9413b4b", new MKGeneralListenerImpl());
  63. setContentView(R.layout.activity_main);
  64. //点击按钮手动请求定位
  65. ((Button) findViewById(R.id.request)).setOnClickListener(new OnClickListener() {
  66. @Override
  67. public void onClick(View v) {
  68. requestLocation();
  69. }
  70. });
  71. mMapView = (MapView) findViewById(R.id.bmapView); //获取百度地图控件实例
  72. mMapController = mMapView.getController(); //获取地图控制器
  73. mMapController.enableClick(true);   //设置地图是否响应点击事件
  74. mMapController.setZoom(14);   //设置地图缩放级别
  75. mMapView.setBuiltInZoomControls(true);   //显示内置缩放控件
  76. mMapView.setTraffic(true);  //设置交通信息图
  77. //        mMapView.setSatellite(true);  //设置卫星图
  78. //        mMapController.setOverlooking(-45);  //设置地图俯视角度 ,范围:0~ -45
  79. mPopupView = LayoutInflater.from(this).inflate(R.layout.pop_layout, null);
  80. //实例化弹出窗口图层
  81. mPopupOverlay = new PopupOverlay(mMapView ,new PopupClickListener() {
  82. /**
  83. * 点击弹出窗口图层回调的方法
  84. */
  85. @Override
  86. public void onClickedPopup(int arg0) {
  87. //隐藏弹出窗口图层
  88. mPopupOverlay.hidePop();
  89. }
  90. });
  91. //实例化定位服务,LocationClient类必须在主线程中声明
  92. mLocClient = new LocationClient(getApplicationContext());
  93. mLocClient.registerLocationListener(new BDLocationListenerImpl());//注册定位监听接口
  94. /**
  95. * LocationClientOption 该类用来设置定位SDK的定位方式。
  96. */
  97. LocationClientOption option = new LocationClientOption();
  98. option.setOpenGps(true); //打开GPRS
  99. option.setAddrType("all");//返回的定位结果包含地址信息
  100. option.setCoorType("bd09ll");//返回的定位结果是百度经纬度,默认值gcj02
  101. option.setPriority(LocationClientOption.GpsFirst); // 设置GPS优先
  102. option.setScanSpan(5000); //设置发起定位请求的间隔时间为5000ms
  103. option.disableCache(false);//禁止启用缓存定位
  104. //      option.setPoiNumber(5);    //最多返回POI个数
  105. //      option.setPoiDistance(1000); //poi查询距离
  106. //      option.setPoiExtraInfo(true);  //是否需要POI的电话和地址等详细信息
  107. mLocClient.setLocOption(option);  //设置定位参数
  108. mLocClient.start();  // 调用此方法开始定位
  109. //定位图层初始化
  110. myLocationOverlay = new LocationOverlay(mMapView);
  111. //实例化定位数据,并设置在我的位置图层
  112. mLocData = new LocationData();
  113. myLocationOverlay.setData(mLocData);
  114. //添加定位图层
  115. mMapView.getOverlays().add(myLocationOverlay);
  116. //修改定位数据后刷新图层生效
  117. mMapView.refresh();
  118. }
  119. /**
  120. * 定位接口,需要实现两个方法
  121. * @author xiaanming
  122. *
  123. */
  124. public class BDLocationListenerImpl implements BDLocationListener {
  125. /**
  126. * 接收异步返回的定位结果,参数是BDLocation类型参数
  127. */
  128. @Override
  129. public void onReceiveLocation(BDLocation location) {
  130. if (location == null) {
  131. return;
  132. }
  133. StringBuffer sb = new StringBuffer(256);
  134. sb.append("time : ");
  135. sb.append(location.getTime());
  136. sb.append("\nerror code : ");
  137. sb.append(location.getLocType());
  138. sb.append("\nlatitude : ");
  139. sb.append(location.getLatitude());
  140. sb.append("\nlontitude : ");
  141. sb.append(location.getLongitude());
  142. sb.append("\nradius : ");
  143. sb.append(location.getRadius());
  144. if (location.getLocType() == BDLocation.TypeGpsLocation){
  145. sb.append("\nspeed : ");
  146. sb.append(location.getSpeed());
  147. sb.append("\nsatellite : ");
  148. sb.append(location.getSatelliteNumber());
  149. } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
  150. sb.append("\naddr : ");
  151. sb.append(location.getAddrStr());
  152. }
  153. Log.e("log", sb.toString());
  154. MainActivity.this.location = location;
  155. mLocData.latitude = location.getLatitude();
  156. mLocData.longitude = location.getLongitude();
  157. //如果不显示定位精度圈,将accuracy赋值为0即可
  158. mLocData.accuracy = location.getRadius();
  159. mLocData.direction = location.getDerect();
  160. //将定位数据设置到定位图层里
  161. myLocationOverlay.setData(mLocData);
  162. //更新图层数据执行刷新后生效
  163. mMapView.refresh();
  164. if(isFirstLoc || isRequest){
  165. //将给定的位置点以动画形式移动至地图中心
  166. mMapController.animateTo(new GeoPoint(
  167. (int) (location.getLatitude() * 1e6), (int) (location
  168. .getLongitude() * 1e6)));
  169. showPopupOverlay(location);
  170. isRequest = false;
  171. }
  172. isFirstLoc = false;
  173. }
  174. /**
  175. * 接收异步返回的POI查询结果,参数是BDLocation类型参数
  176. */
  177. @Override
  178. public void onReceivePoi(BDLocation poiLocation) {
  179. }
  180. }
  181. //继承MyLocationOverlay重写dispatchTap方法
  182. private class LocationOverlay extends MyLocationOverlay{
  183. public LocationOverlay(MapView arg0) {
  184. super(arg0);
  185. }
  186. /**
  187. * 在“我的位置”坐标上处理点击事件。
  188. */
  189. @Override
  190. protected boolean dispatchTap() {
  191. //点击我的位置显示PopupOverlay
  192. showPopupOverlay(location);
  193. return super.dispatchTap();
  194. }
  195. }
  196. /**
  197. * 显示弹出窗口图层PopupOverlay
  198. * @param location
  199. */
  200. private void showPopupOverlay(BDLocation location){
  201. TextView popText = ((TextView)mPopupView.findViewById(R.id.location_tips));
  202. popText.setText("[我的位置]\n" + location.getAddrStr());
  203. mPopupOverlay.showPopup(getBitmapFromView(popText),
  204. new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)),
  205. 15);
  206. }
  207. /**
  208. * 手动请求定位的方法
  209. */
  210. public void requestLocation() {
  211. isRequest = true;
  212. if(mLocClient != null && mLocClient.isStarted()){
  213. showToast("正在定位......");
  214. mLocClient.requestLocation();
  215. }else{
  216. Log.d("log", "locClient is null or not started");
  217. }
  218. }
  219. /**
  220. * 显示Toast消息
  221. * @param msg
  222. */
  223. private void showToast(String msg){
  224. if(mToast == null){
  225. mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
  226. }else{
  227. mToast.setText(msg);
  228. mToast.setDuration(Toast.LENGTH_SHORT);
  229. }
  230. mToast.show();
  231. }
  232. /**
  233. * 将View转换成Bitmap的方法
  234. * @param view
  235. * @return
  236. */
  237. public static Bitmap getBitmapFromView(View view) {
  238. view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
  239. view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
  240. view.buildDrawingCache();
  241. Bitmap bitmap = view.getDrawingCache();
  242. return bitmap;
  243. }
  244. /**
  245. * 常用事件监听,用来处理通常的网络错误,授权验证错误等
  246. * @author xiaanming
  247. *
  248. */
  249. public class MKGeneralListenerImpl implements MKGeneralListener{
  250. /**
  251. * 一些网络状态的错误处理回调函数
  252. */
  253. @Override
  254. public void onGetNetworkState(int iError) {
  255. if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
  256. showToast("您的网络出错啦!");
  257. }
  258. }
  259. /**
  260. * 授权错误的时候调用的回调函数
  261. */
  262. @Override
  263. public void onGetPermissionState(int iError) {
  264. if (iError ==  MKEvent.ERROR_PERMISSION_DENIED) {
  265. showToast("API KEY错误, 请检查!");
  266. }
  267. }
  268. }
  269. @Override
  270. protected void onResume() {
  271. //MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
  272. mMapView.onResume();
  273. super.onResume();
  274. }
  275. @Override
  276. protected void onPause() {
  277. //MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
  278. mMapView.onPause();
  279. super.onPause();
  280. }
  281. @Override
  282. protected void onDestroy() {
  283. //MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
  284. mMapView.destroy();
  285. //退出应用调用BMapManager的destroy()方法
  286. if(mBMapManager != null){
  287. mBMapManager.destroy();
  288. mBMapManager = null;
  289. }
  290. //退出时销毁定位
  291. if (mLocClient != null){
  292. mLocClient.stop();
  293. }
  294. super.onDestroy();
  295. }
  296. }
时间: 2024-10-12 07:05:45

Android 百度地图开发(二)的相关文章

[android] 百度地图开发 (二).定位城市位置和城市POI搜索

一. 百度地图城市定位和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了如何申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述如何定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么如何在百度地图上定位某一个位置呢?       通过类GeoPoint可以定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法可以获取Location对象,再定位经纬度设置其为地图中心即可显示当

[android] 百度地图开发 (三).定位当前位置及getLastKnownLocation获取location总为空问题

       前一篇百度地图开发讲述"(二).定位城市位置和城市POI搜索",主要通过监听对象MKSearchListener类实现城市兴趣点POI(Point of Interest)搜索.该篇讲述定位当前自己的位置及使用getLastKnownLocation获取location总时为空值的问题. 一. 定位当前位置的原理及实现       定位当前位置可以通过LBS(Location Based Service,基于位置的服务),主要工作原理是利用无线网络Network或GPS定

Android 百度地图开发(一)--- 申请API Key和在项目中显示百度地图

标签: Android百度地图API Key  分类: Android 百度地图开发(2)  最近自己想研究下地图,本来想研究google Map,但是申请API key比较坑爹,于是从百度地图入手,其实他们的用法都差不多,本篇文章就带领大家在自己的Android项目中加入百度地图的功能,接下来我会写一系列关于百度地图的文章,欢迎大家到时候关注!   一 申请API key 在使用百度地图之前,我们必须去申请一个百度地图的API key,申请地址http://lbsyun.baidu.com/a

Android百度地图(二)结合方向传感器我们自己定位哪里走

Android百度地图(二)结合方向传感器我们自己定位哪里走 本文代码在http://blog.csdn.net/xyzz609/article/details/51943556的基础上进一步改动.有兴趣的同学能够研究下怎么改动的 本篇我们准备为地图加入:第一.定位功能:第二.与方向传感器结合.通过旋转手机进行道路的方向确认. 有了这两个功能.地图已经能够为我服务了 @一启动就自己主动定位了 a,MainActivity 中加入定位代码,定位的监听器MyLocationListener b.封装

android 百度地图开发实例(转载)

因为在我的寝室google基站定位返回的数据总是为空,所以换成百度地图,发现百度地图开发起来非常方便,提供了许多有用的工具,地图的加载速度也比google地图快许多. 为了加强记忆,写一点android 百度地图开发常用的方法. 1初始化 MapManager mBMapMan = new BMapManager(this);boolean isSuccess = mBMapMan.init(this.mStrKey, new MyGeneralListener()); isSuccess 的值

Android 百度地图开发之一(Hello BaiDu Map)

之前也接触过百度地图的开发,但那是在网上找的案例或代码,而且是比较老的版本.打算重新学习一下百度地图的开发. 本次使用的百度地图的版本是 Android SDK v3.0.0 本篇文章主要讲述百度地图开发的准备和地图的成功显示即可. 首先建议大家先申请注册一个百度账号. 申请密钥(要想实现百度地图的相关服务必须申请密钥),网址:http://lbsyun.baidu.com/apiconsole/key 需要注意的是:应用名称不要重复或无效,安全码的输入详情请查看:http://develope

android百度地图开发之自动定位所在位置与固定位置进行驾车,步行,公交路线搜索

最近跟着百度地图API学地图开发,先是学了路径搜索,对于已知坐标的两点进行驾车.公交.步行三种路径的搜索(公交路径运行没效果,待学习中),后来又 学了定位功能,能够获取到自己所在位置的经纬度,但当将两者合起来先自动获取自己所在位置的经纬度然后与固定地点进行路径搜索时却弄不出来了,因为刚开始 写的两者在两个类中总是取不到经纬度值,后来将两者写到同一个类中去了,终于取到经纬度值了,也运行出来了.需要 在 BDLocationListener的onReceiveLocation里获取到经纬度值,因为已

C#的百度地图开发(二)转换JSON数据为相应的类

原文:C#的百度地图开发(二)转换JSON数据为相应的类 在<C#的百度地图开发(一)发起HTTP请求>一文中我们向百度提供的API的URL发起请求,并得到了返回的结果,结果是一串JSON数据,我们先将这个JSON数据,使用在线工盯进行格式化. [html] view plaincopy { "status": 0, "result": [ { "x": 39.926674689976, "y": 116.4659

[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题

    最近做android百度地图,但是使用baidumapapi_v2_3_1.jar和libBaiduMapSDK_v2_3_1.so显示百度地图时总是遇到问题--只显示网格而没有显示地图,网络连接和APIKey申请都是正确的,就是不知道为什么不能显示,网上也有很多人遇到这个问题,有的是SDK更新不兼容.而且网上很多百度地图都是使用V2.3.1版本,后来没有办法只有通过baidumapapi_v2_4_1.jar完成显示地图. 其中需要注意的是使用2.3.1时调用manager.init(

[android] 百度地图开发 (两).所在地的城市定位和城市POI搜索

一个. 百度地图城市位置和POI搜索知识       上一篇文章"百度地图开发(一)"中讲述了怎样申请百度APIKey及解决显示空白网格的问题.该篇文章主要讲述怎样定位城市位置.定位自己的位置和进行城市兴趣点POI(Point of Interest)搜索.那么怎样在百度地图上定位某一个位置呢?       通过类GeoPoint能够定义经纬度,它存放着纬度值和经度值,通过getLastKnownLocation()方法能够获取Location对象,再定位经纬度设置其为地图中心就可以显