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.MapView android: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. public BMapManager mapManager = null;

  2. static MapApplication app;

  3. public String mStrKey = "你申请的key值";
  4. @Override

  5. public void onCreate() {

  6. mapManager = new BMapManager(this);

  7. mapManager.init(mStrKey, new
    MyGeneralListener());

  8. }

  9. @Override

  10. //建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗

  11. public void onTerminate() {

  12. // TODO Auto-generated method stub

  13. if(mapManager != null)

  14. {

  15. mapManager.destroy();

  16. mapManager = null;

  17. }

  18. super.onTerminate();

  19. }
  20. static class MyGeneralListener implements MKGeneralListener{
  21. @Override

  22. public void onGetNetworkState(int arg0) {

  23. Toast.makeText(MapApplication.app.getApplicationContext(),
    "您的网络出错啦!",

  24. Toast.LENGTH_LONG).show();

  25. }

  26. @Override

  27. public void onGetPermissionState(int iError) {

  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. private BMapManager mBMapMan =
    null;

  37. private MapView mMapView = null;

  38. private MapController bMapController;

  39. private MKLocationManager mkLocationManager;

  40. private MKSearch mkSearch;
  41. private TextView address_view;   //定位到的位置信息
  42. private ProgressDialog dialog;

  43. private List<HotelInfo> hotelList;
  44. private int distance = 1000;  //查询的范围(单位:m)
  45. Handler handler = new Handler(){

  46. @Override

  47. public void handleMessage(Message msg) {
  48. double lat =
    msg.getData().getDouble("lat");

  49. double lon =
    msg.getData().getDouble("lon");

  50. if(lat!=0&&lon!=0){

  51. GeoPoint
    point = new GeoPoint(

  52. (int) (lat * 1E6),

  53. (int) (lon * 1E6));

  54. bMapController.animateTo(point);  //设置地图中心点

  55. bMapController.setZoom(15);
  56. mkSearch.reverseGeocode(point);   //解析地址(异步方法)
  57. MyLocationOverlay myLoc = new
    MyLocationOverlayFromMap(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. Drawable
    marker = getResources().getDrawable(R.drawable.iconmarka); 
    //设置marker

  66. marker.setBounds(0, 0, marker.getIntrinsicWidth(),
    marker.getIntrinsicHeight());   //为maker定义位置和边界

  67. mMapView.getOverlays().add(new
    OverItemList(marker,hotelList,ShowMapAct.this,bMapController));

  68. }else
    if(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. protected void onCreate(Bundle savedInstanceState) {
  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. SpannableStringBuilder style = new
    SpannableStringBuilder(String.format(getResources().getString(R.string.location_text),"位置不详"));

  84. style.setSpan(new ForegroundColorSpan(Color.RED), 5,
    style.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

  85. address_view.setText(style);
  86. Button location_button =
    (Button)findViewById(R.id.location_button_id);

  87. location_button.setOnClickListener(new
    View.OnClickListener(){

  88. @Override

  89. public void onClick(View v)
    {

  90. dialog = ProgressDialog.show(ShowMapAct.this, "", "数据加载中,请稍后.....");

  91. new Thread(new MyThread()).start();

  92. }

  93. });
  94. mkSearch = new MKSearch();  
    //初始化一个MKSearch,根据location解析详细地址

  95. mkSearch.init(mBMapMan, this);

  96. mMapView.setBuiltInZoomControls(true);   //启用内置的缩放控件

  97. bMapController =
    mMapView.getController();

  98. GeoPoint defaultPoint = new
    GeoPoint((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. public void init(){

  107. MapApplication app =
    (MapApplication)getApplication();

  108. if (app.mapManager == null)
    {

  109. app.mapManager = new
    BMapManager(getApplication());

  110. app.mapManager.init(app.mStrKey,
    new MapApplication.MyGeneralListener());

  111. }

  112. mBMapMan = app.mapManager;

  113. }
  114. @Override

  115. protected void onDestroy() {

  116. MapApplication app =
    (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. protected void onPause() {

  127. if (mBMapMan != null)
    {

  128. //
    终止百度地图API

  129. mBMapMan.stop();

  130. }

  131. super.onPause();

  132. }
  133. @Override

  134. protected void onResume() {

  135. if (mBMapMan != null)
    {

  136. //
    开启百度地图API

  137. mBMapMan.start();

  138. }

  139. super.onResume();

  140. }
  141. @Override

  142. protected boolean isRouteDisplayed() {

  143. return false;

  144. }
  145. @Override

  146. public void onGetAddrResult(MKAddrInfo result, int iError) {

  147. if(result==null) return;

  148. SpannableStringBuilder style = new
    SpannableStringBuilder(String.format(getResources().getString(R.string.location_text),result.strAddr));

  149. style.setSpan(new ForegroundColorSpan(Color.RED), 5,
    style.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

  150. address_view.setText(style);

  151. if(dialog!=null) dialog.dismiss();

  152. }
  153. @Override

  154. public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1)
    {}

  155. @Override

  156. public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2)
    {}

  157. @Override

  158. public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1)
    {}

  159. @Override

  160. public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1)
    {}
  161. /**

  162. * 重新定位,加载数据

  163. * @author Administrator

  164. *

  165. */

  166. class MyThread implements Runnable{

  167. @Override

  168. public void run() {

  169. /**

  170. * 最重要的就是这个玩意

  171. *
    由于LocationListener获取第一个位置修正的时间会很长,为了避免用户等待,

  172. *
    在LocationListener获取第一个更精确的位置之前,应当使用getLocationInfo() 获取一个缓存的位置

  173. */

  174. Location location =
    mkLocationManager.getLocationInfo();

  175. double lat = 0d,lon =
    0d;

  176. if(location!=null){  
    //定位到位置

  177. String
    coordinate = location.getLatitude()+","+location.getLongitude();

  178. HotelRemoteData hotelData = new HotelRemoteData();

  179. /**

  180. *
    远程获取酒店列表数据

  181. */

  182. hotelList = hotelData.getHotelToMap(coordinate,distance);

  183. lat =
    location.getLatitude();

  184. lon =
    location.getLongitude();

  185. }
  186. Message msg = new
    Message();

  187. Bundle data = new
    Bundle();

  188. data.putDouble("lat",
    lat);

  189. data.putDouble("lon",
    lon);

  190. msg.setData(data);

  191. handler.sendMessage(msg);

  192. }

  193. }

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

Java代码

  1. LocationListener listener = new LocationListener() {

  2. @Override

  3. /** 位置变化,百度地图即会调用该方法去获取位置信息。

  4. *
    (我测试发现就算手机不动,它也会偶尔重新去加载位置;只要你通过重力感应,他就一定会重新加载)

  5. */

  6. public void onLocationChanged(Location location)
    {

  7. GeoPoint gp =  new GeoPoint((int)
    (location.getLatitude() * 1E6), (int) (location.getLongitude() *
    1E6));   //通过地图上的经纬度转换为地图上的坐标点

  8. bMapController.animateTo(gp); 
    //动画般的移动到定位的位置

  9. }

  10. };

时间: 2024-10-09 06:25:48

Android 百度地图定位(手动+自动) 安卓开发教程的相关文章

Android百度地图定位

说到百度地图,现在这个时候应该都是众说周知了吧,多的话不扯了,直接奔向主题. 接入百度地图api必须申请key,这里申请key就不用说了,官方文档上面有介绍如何去申请key. 这里使用的百度地图定位是4.2的版本,api是3.1.1版本.如果申请好了key,那么就可以进入编码阶段了,具体实现如下: 1.引入百度地图相关jar包及armeabi目录到libs目录中 2.在项目的AndroidManifest.xml文件中配置相关信息 配置权限 <uses-permission android:na

Android百度地图定位demo

AS写的百度地图定位demo 版本V6.0.5 先上效果图     版权声明:本文为博主原创文章,未经博主允许不得转载.

android 百度地图定位开发1

首先注册成为百度开发者 然后进入百度开发者中心 点击LBS 跳到下一个页面 点击Android 开发 里面的基础地图 进入  点击获取密钥 进入   点击创建应用 进入     应用名称自己填 应用类型 选Android SDK   包名为项目包名  SHA1点击查看详细配置方法 进入可以自己看 这里直接讲方法 第一种方法: 第1步:运行进入控制台 第2步:定位到.android文件夹下,输入cd .android 第3步:输入keytool -list -v -keystore debug.k

android 百度地图定位开发2

先下载了示例代码 进行配置(可查看开发 指南 Hello BaiDuMap) 第一步:创建并配置工程(具体方法参见工程配置部分的介绍): 第二步:在AndroidManifest中添加开发密钥.所需权限等信息: (1)在application中添加开发密钥 <application> <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="开发者 key" /> &l

android百度地图定位开发

一.activity import android.app.Activity; import android.graphics.Point;import android.graphics.PointF;import android.os.Bundle;import android.os.Message;import com.baidu.location.BDLocation;import com.baidu.location.BDLocationListener;import com.baidu

android 百度地图 定位功能

废话不多说 直接新建一个新android项目:location,然后花一分钟申请一个key,然后就是把百度定位demo抄一下就行 1:首先在AndroidManifest.xml中添加权限 <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" > </uses-permission> <uses-permission android:name="andr

Android百度地图定位定到了海里,定到了非洲

百度定位偶尔会出现定到非洲的现象,一开始我以为是GPS信号不太好的原因,后来出现的次数有点多了,上网查找才发现是权限不够的原因 官网地址http://lbsyun.baidu.com/index.php?title=android-locsdk/guide/create-project/android-studio 注意这个权限 <uses-permission android:name="android.permission.READ_PHONE_STATE" /> 除了

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

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

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

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