`
king_tt
  • 浏览: 2259729 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Android 百度地图定位(手动+自动)

 
阅读更多
最近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的。我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置。 经过2天研究和咨询,找到了解决方案,在此备忘一下。

注意:定位使用真机才能够真正定位;模拟器的话,在DDMS中的Emulator Control中,选择Manual,下面单选按钮选择Decimal,然后填写经纬度,send后,再点击定位我的位置按钮,就能定位了(这应该算是固定定位,哈哈。。。)、

1、第一步当然是获取一个针对自己项目的key值。http://dev.baidu.com/wiki/static/imap/key/

2、使用百度API是有前提的,摘自百度:首先将API包括的两个文件baidumapapi.jar和libBMapApiEngine.so拷贝到工程根目录及libs\armeabi目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定baidumapapi.jar,确定后返回,这样您就可以在您的程序中使用API了。(这两个文件见附件)。

3、按照自己的需求写一个layout,我的如下:

<?xml version="1.0" encoding="utf-8"?>

Xml代码 收藏代码
  1. <LinearLayout
  2. xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView
  8. android:id="@+id/myLocation_id"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:textSize="15dp"
  12. android:gravity="center_horizontal"
  13. android:textColor="@drawable/black"
  14. android:background="@drawable/gary"
  15. />
  16. <com.baidu.mapapi.MapViewandroid:id="@+id/bmapsView"
  17. android:layout_width="fill_parent"android:layout_height="fill_parent"
  18. android:clickable="true"android:layout_weight="1"
  19. />
  20. <Button
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23. android:id="@+id/location_button_id"
  24. android:text="@string/location_button_text"
  25. />
  26. </LinearLayout>

需要特别注意的是:<com.baidu.mapapi.MapView /> 这玩意。

4、写一个MapApplication实现application,提供全局的BMapManager,以及其初始化。

Java代码 收藏代码
  1. publicBMapManagermapManager=null;
  2. staticMapApplicationapp;
  3. publicStringmStrKey="你申请的key值";
  4. @Override
  5. publicvoidonCreate(){
  6. mapManager=newBMapManager(this);
  7. mapManager.init(mStrKey,newMyGeneralListener());
  8. }
  9. @Override
  10. //建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
  11. publicvoidonTerminate(){
  12. //TODOAuto-generatedmethodstub
  13. if(mapManager!=null)
  14. {
  15. mapManager.destroy();
  16. mapManager=null;
  17. }
  18. super.onTerminate();
  19. }
  20. staticclassMyGeneralListenerimplementsMKGeneralListener{
  21. @Override
  22. publicvoidonGetNetworkState(intarg0){
  23. Toast.makeText(MapApplication.app.getApplicationContext(),"您的网络出错啦!",
  24. Toast.LENGTH_LONG).show();
  25. }
  26. @Override
  27. publicvoidonGetPermissionState(intiError){
  28. if(iError==MKEvent.ERROR_PERMISSION_DENIED){
  29. //授权Key错误:
  30. Toast.makeText(MapApplication.app.getApplicationContext(),"您的授权Key不正确!",
  31. Toast.LENGTH_LONG).show();
  32. }
  33. }
  34. }
  35. 5、接下来就是按照百度api写定位代码了,使用handler机制去添加定位图层,需要说明的都在注释上了。
  36. privateBMapManagermBMapMan=null;
  37. privateMapViewmMapView=null;
  38. privateMapControllerbMapController;
  39. privateMKLocationManagermkLocationManager;
  40. privateMKSearchmkSearch;
  41. privateTextViewaddress_view;//定位到的位置信息
  42. privateProgressDialogdialog;
  43. privateList<HotelInfo>hotelList;
  44. privateintdistance=1000;//查询的范围(单位:m)
  45. Handlerhandler=newHandler(){
  46. @Override
  47. publicvoidhandleMessage(Messagemsg){
  48. doublelat=msg.getData().getDouble("lat");
  49. doublelon=msg.getData().getDouble("lon");
  50. if(lat!=0&&lon!=0){
  51. GeoPointpoint=newGeoPoint(
  52. (int)(lat*1E6),
  53. (int)(lon*1E6));
  54. bMapController.animateTo(point);//设置地图中心点
  55. bMapController.setZoom(15);
  56. mkSearch.reverseGeocode(point);//解析地址(异步方法)
  57. MyLocationOverlaymyLoc=newMyLocationOverlayFromMap(ShowMapAct.this,mMapView);
  58. myLoc.enableMyLocation();//启用定位
  59. myLoc.enableCompass();//启用指南针
  60. mMapView.getOverlays().add(myLoc);
  61. }else{
  62. Toast.makeText(ShowMapAct.this,"没有加载到您的位置",Toast.LENGTH_LONG).show();
  63. }
  64. if(hotelList!=null){
  65. Drawablemarker=getResources().getDrawable(R.drawable.iconmarka);//设置marker
  66. marker.setBounds(0,0,marker.getIntrinsicWidth(),marker.getIntrinsicHeight());//为maker定义位置和边界
  67. mMapView.getOverlays().add(newOverItemList(marker,hotelList,ShowMapAct.this,bMapController));
  68. }elseif(hotelList==null&&lat!=0&&lon!=0){
  69. Toast.makeText(ShowMapAct.this,"网络异常,没有获取到酒店信息。",Toast.LENGTH_LONG).show();
  70. }
  71. if(dialog!=null)dialog.dismiss();
  72. }
  73. };
  74. @Override
  75. protectedvoidonCreate(BundlesavedInstanceState){
  76. distance=getIntent().getExtras().getInt("distance");//获取查询范围
  77. super.onCreate(savedInstanceState);
  78. setContentView(R.layout.location);
  79. mMapView=(MapView)findViewById(R.id.bmapsView);//初始化一个mapView存放Map
  80. init();//初始化地图管理器
  81. super.initMapActivity(mBMapMan);
  82. address_view=(TextView)findViewById(R.id.myLocation_id);
  83. SpannableStringBuilderstyle=newSpannableStringBuilder(String.format(getResources().getString(R.string.location_text),"位置不详"));
  84. style.setSpan(newForegroundColorSpan(Color.RED),5,style.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  85. address_view.setText(style);
  86. Buttonlocation_button=(Button)findViewById(R.id.location_button_id);
  87. location_button.setOnClickListener(newView.OnClickListener(){
  88. @Override
  89. publicvoidonClick(Viewv){
  90. dialog=ProgressDialog.show(ShowMapAct.this,"","数据加载中,请稍后.....");
  91. newThread(newMyThread()).start();
  92. }
  93. });
  94. mkSearch=newMKSearch();//初始化一个MKSearch,根据location解析详细地址
  95. mkSearch.init(mBMapMan,this);
  96. mMapView.setBuiltInZoomControls(true);//启用内置的缩放控件
  97. bMapController=mMapView.getController();
  98. GeoPointdefaultPoint=newGeoPoint((int)(39.920934*1E6),(int)(116.412817*1E6));//用给定的经纬度构造一个GeoPoint,单位是微度(度*1E6)
  99. bMapController.setCenter(defaultPoint);//设置地图中心点
  100. bMapController.setZoom(12);//设置地图zoom级别
  101. mkLocationManager=mBMapMan.getLocationManager();
  102. }
  103. /**
  104. *初始化地图管理器BMapManager
  105. */
  106. publicvoidinit(){
  107. MapApplicationapp=(MapApplication)getApplication();
  108. if(app.mapManager==null){
  109. app.mapManager=newBMapManager(getApplication());
  110. app.mapManager.init(app.mStrKey,newMapApplication.MyGeneralListener());
  111. }
  112. mBMapMan=app.mapManager;
  113. }
  114. @Override
  115. protectedvoidonDestroy(){
  116. MapApplicationapp=(MapApplication)getApplication();
  117. if(mBMapMan!=null){
  118. mBMapMan.destroy();
  119. app.mapManager.destroy();
  120. app.mapManager=null;
  121. mBMapMan=null;
  122. }
  123. super.onDestroy();
  124. }
  125. @Override
  126. protectedvoidonPause(){
  127. if(mBMapMan!=null){
  128. //终止百度地图API
  129. mBMapMan.stop();
  130. }
  131. super.onPause();
  132. }
  133. @Override
  134. protectedvoidonResume(){
  135. if(mBMapMan!=null){
  136. //开启百度地图API
  137. mBMapMan.start();
  138. }
  139. super.onResume();
  140. }
  141. @Override
  142. protectedbooleanisRouteDisplayed(){
  143. returnfalse;
  144. }
  145. @Override
  146. publicvoidonGetAddrResult(MKAddrInforesult,intiError){
  147. if(result==null)return;
  148. SpannableStringBuilderstyle=newSpannableStringBuilder(String.format(getResources().getString(R.string.location_text),result.strAddr));
  149. style.setSpan(newForegroundColorSpan(Color.RED),5,style.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
  150. address_view.setText(style);
  151. if(dialog!=null)dialog.dismiss();
  152. }
  153. @Override
  154. publicvoidonGetDrivingRouteResult(MKDrivingRouteResultarg0,intarg1){}
  155. @Override
  156. publicvoidonGetPoiResult(MKPoiResultarg0,intarg1,intarg2){}
  157. @Override
  158. publicvoidonGetTransitRouteResult(MKTransitRouteResultarg0,intarg1){}
  159. @Override
  160. publicvoidonGetWalkingRouteResult(MKWalkingRouteResultarg0,intarg1){}
  161. /**
  162. *重新定位,加载数据
  163. *@authorAdministrator
  164. *
  165. */
  166. classMyThreadimplementsRunnable{
  167. @Override
  168. publicvoidrun(){
  169. /**
  170. *最重要的就是这个玩意
  171. *由于LocationListener获取第一个位置修正的时间会很长,为了避免用户等待,
  172. *在LocationListener获取第一个更精确的位置之前,应当使用getLocationInfo()获取一个缓存的位置
  173. */
  174. Locationlocation=mkLocationManager.getLocationInfo();
  175. doublelat=0d,lon=0d;
  176. if(location!=null){//定位到位置
  177. Stringcoordinate=location.getLatitude()+","+location.getLongitude();
  178. HotelRemoteDatahotelData=newHotelRemoteData();
  179. /**
  180. *远程获取酒店列表数据
  181. */
  182. hotelList=hotelData.getHotelToMap(coordinate,distance);
  183. lat=location.getLatitude();
  184. lon=location.getLongitude();
  185. }
  186. Messagemsg=newMessage();
  187. Bundledata=newBundle();
  188. data.putDouble("lat",lat);
  189. data.putDouble("lon",lon);
  190. msg.setData(data);
  191. handler.sendMessage(msg);
  192. }
  193. }

6、还有一种就是百度示例相当推荐的,也是加载定位位置速度比较快的,那就是通过定位监听器来定位信息。没啥难的,照着百度的示例写,都能搞定。

Java代码 收藏代码
  1. LocationListenerlistener=newLocationListener(){
  2. @Override
  3. /**位置变化,百度地图即会调用该方法去获取位置信息。
  4. *(我测试发现就算手机不动,它也会偶尔重新去加载位置;只要你通过重力感应,他就一定会重新加载)
  5. */
  6. publicvoidonLocationChanged(Locationlocation){
  7. GeoPointgp=newGeoPoint((int)(location.getLatitude()*1E6),(int)(location.getLongitude()*1E6));//通过地图上的经纬度转换为地图上的坐标点
  8. bMapController.animateTo(gp);//动画般的移动到定位的位置
  9. }
  10. };


分享到:
评论

相关推荐

    百度地图的手动定位和自动定位

    开发者需要对Android系统、Java编程以及百度地图SDK有一定的理解才能有效地实现手动定位和自动定位功能。通过阅读提供的博客文章,开发者可以获得具体的实现步骤和代码示例,进一步提升自己的开发技能。

    百度地图poi搜索+自动检索附近地址

    自动检索附近地址是利用了百度地图的实时定位功能,结合POI检索。用户开启应用后,系统会获取用户当前的位置信息,然后在一定范围内自动检索附近的POI,无需用户手动输入位置信息。 4. **实现步骤** - **集成百度...

    百度地图Poi搜索功能(含自动检索附近地址)

    总结来说,Android百度地图开发中的Poi搜索功能,结合自动检索附近地址和小地图自定位,为用户提供了一种高效、便捷的方式来发现和导航至感兴趣的地点。开发者需要熟练掌握百度地图SDK的使用,理解定位、检索和地图...

    Android应用源码之百度地图移动获取位置,自动定位.rar

    在Android开发中,集成百度地图API来实现移动设备上的位置获取和自动定位是一项常见的任务。这份"Android应用源码之百度地图移动获取位置,自动定位.rar"压缩包中包含了一个完整的示例项目,用于演示如何在Android...

    Android调用百度地图api

    本篇将详细讲解如何在Android应用中调用百度地图API,并实现自动定位、获取中心位置坐标以及标注地理信息等功能。 首先,我们需要在百度地图开放平台注册一个账号,创建应用并获取API密钥。这个API密钥是连接我们...

    百度地图定位小应用

    在本教程中,我们将深入探讨如何在Android应用中实现百度地图定位功能。首先,我们需要理解“百度地图定位小应用”这个项目的核心概念。 1. **百度地图API** 百度地图提供了丰富的API服务,允许开发者在Android...

    基于百度地图的轨迹显示

    【基于百度地图的轨迹显示】是一个Android应用的实例,它展示了如何在百度地图API上实现用户的运动轨迹可视化。这个demo的目的是帮助开发者了解如何利用百度地图服务来收集、存储和展示用户的位置数据,特别是在运动...

    百度地图定位

    本篇文章将深入探讨“百度地图定位”这一主题,包括如何实现地图定位、添加标注以及点聚合功能。 首先,百度地图定位是通过集成百度地图API来获取设备的地理位置信息。百度地图提供了一个强大的定位SDK,支持GPS、...

    初学百度地图demo

    在本文中,我们将深入探讨如何使用百度地图API创建一个初学者友好的示例应用,该应用能够实现手动定位以及在地图上显示用户当前位置的详细信息。我们将覆盖以下几个关键知识点: 1. **百度地图API**: 百度地图API...

    百度定位无地图

    在Android开发中,集成百度地图SDK进行位置服务是常见的需求,尤其在开发涉及地理信息的应用时。"百度定位无地图"这个标题暗示了一个问题:在尝试使用百度地图SDK进行定位时,显示的结果没有地图背景。这可能是由于...

    开源Android离线地图开发——Bigplanet

    开发者需要考虑如何设计更新机制,例如在有网络时自动下载新的地图数据,或者用户手动触发更新。 8. **性能优化** 对于大型地图数据,性能优化至关重要。开发者应关注数据的预处理、压缩、分块等技术,以减少内存...

    根据经纬度画路线百度地图

    通常,百度地图会自动处理这一部分,但在自定义渲染时,你需要手动处理。 5. **交互操作**:可以通过监听地图的事件,如`click`,来实现点击地图获取经纬度坐标的功能。还可以通过API提供的方法进行缩放、平移等...

    对Android 系统所有危险权限手动申请演示、retrofit2网络请求、百度定位使用。

    本项目旨在演示如何在Android应用中手动申请这些危险权限,同时结合了Retrofit2进行网络请求以及百度定位服务的使用。下面将详细介绍这几个关键知识点。 首先,关于Android危险权限的申请,Android 6.0(API级别23...

    百度地图jar包

    通过以上步骤,你就能成功地将百度地图的定位功能集成到你的Android应用中。理解并掌握这些知识点对于一个Android开发者来说至关重要,它不仅帮助你实现特定功能,还增强了应用的用户体验。在实际开发过程中,不断...

    百度定位demo

    本文将详细介绍“百度定位Demo”,一个基于百度地图API实现的位置服务示例,旨在帮助开发者快速理解和接入百度定位服务。 一、百度定位服务概述 百度定位服务是百度地图开放平台提供的一项API服务,它能够为开发者...

    Baidu-MAP.zip_V2 _地图 _地图 导航_地图导航_百度地图 导航

    2. **集成SDK**:将百度地图SDK集成到项目中,可以是Android或iOS应用,或其他支持的平台。 3. **初始化地图**:加载地图视图,设置缩放级别、中心点等参数。 4. **定位服务**:开启定位功能,获取用户当前的位置...

    百度地图PopupOverlay

    在Android开发中,百度地图API是一个强大的工具,用于在应用程序中集成地图功能。"百度地图PopupOverlay"是其中的一个组件,主要用于在地图上添加可交互的弹出窗口,以展示地图上的特定信息或者进行交互操作。这个...

    android 定位 城市选择

    在这个过程中,开发者通常会利用第三方地图服务SDK,如百度地图SDK,来实现定位功能。 首先,我们来了解一下Android定位的基本原理。Android系统提供了多种定位方式,包括GPS(全球定位系统)、Wi-Fi、移动网络等。...

    百度定位Demo

    百度定位SDK是百度为开发者提供的专业定位服务工具包,支持Android和iOS平台。它提供了多种定位方式,包括GPS、WiFi、基站等,并且能够结合多源数据进行智能定位,提高定位精度和速度。此外,该SDK还包含了丰富的...

    Android离线地图雏形

    1. **地图API选择**:Android离线地图的实现通常需要借助地图API,如谷歌地图API、高德地图API或百度地图API。这些API提供了丰富的地图渲染、定位、路线规划等功能,同时也可能提供离线地图的支持。 2. **离线地图...

Global site tag (gtag.js) - Google Analytics