http://www.linuxidc.com/Linux/2011-07/38867p2.htm

本篇文章主要讲解Baidu Map API中MyLocationOverlay的使用。故名思义,MyLocation中文释义为“我的位置”,而Overlay则是“图层”或“覆盖物”的意思,MyLocationOverlay的作用正是用于在地图上标注自己所处的位置。它跟使用ItemizedOverlay非常相似,只不过MyLocationOverlay标记的只有一个点。

在地图上标记用户当前所处位置其实是一个GPS定位应用。首先通过GPS定位获取到用户当前所在位置的经纬度,再将该经纬度所代表的点在地图上标出来。其实除了在地图上标注自己所处的位置外,我们通常还有这样的需求:“如果我的位置发生改变,要能够实时在地图上体现出来”。
      下面我们就来一步步实现上面想要的功能,主要是通过MyLocationOverlay结合LocationListener来实现的。
1)创建布局文件res/layout/main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.android.com/apk/res/android"   Android:orientation="vertical"   Android:layout_width="fill_parent"   Android:layout_height="fill_parent"   >   <com.baidu.mapapi.MapView Android:id="@+id/map_View"   Android:layout_width="fill_parent"   Android:layout_height="fill_parent"   Android:clickable="true"   />
</LinearLayout>

2)创建Activity继承com.baidu.mapapi.MapActivity

package com.liufeng.baidumap;   import Android.location.Location;
import Android.os.Bundle;   import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.GeoPoint;
import com.baidu.mapapi.LocationListener;
import com.baidu.mapapi.MKLocationManager;
import com.baidu.mapapi.MapActivity;
import com.baidu.mapapi.MapController;
import com.baidu.mapapi.MapView;
import com.baidu.mapapi.MyLocationOverlay;   /**  * 创建Activity(继承com.baidu.mapapi.MapActivity)  *   * @author liufeng  * @date 2011-05-02  */
public class MyLocationActivity extends MapActivity implements LocationListener {   private BMapManager mapManager;   private MKLocationManager mLocationManager = null;   private MyLocationOverlay myLocationOverlay;   private MapView mapView;   private MapController mapController;   @Override   public void onCreate(Bundle savedInstanceState) {   super.onCreate(savedInstanceState);   setContentView(R.layout.main);   // 初始化MapActivity    mapManager = new BMapManager(getApplication());   // init方法的第一个参数需填入申请的API Key    mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);   super.initMapActivity(mapManager);   mLocationManager = mapManager.getLocationManager();   // 注册位置更新事件    mLocationManager.requestLocationUpdates(this);   // 使用GPS定位    mLocationManager.enableProvider((int) MKLocationManager.MK_GPS_PROVIDER);   mapView = (MapView) findViewById(R.id.map_View);   // 设置地图模式为交通地图    mapView.setTraffic(true);   // 设置启用内置的缩放控件    mapView.setBuiltInZoomControls(true);   // 构造一个经纬度点    GeoPoint point = new GeoPoint((int) (26.597239 * 1E6), (int) (106.720397 * 1E6));   // 取得地图控制器对象,用于控制MapView    mapController = mapView.getController();   // 设置地图的中心    mapController.setCenter(point);   // 设置地图默认的缩放级别    mapController.setZoom(7);   // 添加定位图层    myLocationOverlay = new MyLocationOverlay(this, mapView);   // 注册GPS位置更新的事件,让地图能实时显示当前位置    myLocationOverlay.enableMyLocation();   // 开启磁场感应传感器    myLocationOverlay.enableCompass();   mapView.getOverlays().add(myLocationOverlay);   }   @Override   protected boolean isRouteDisplayed() {   return false;   }   @Override   protected void onDestroy() {   if (mapManager != null) {   mapManager.destroy();   mapManager = null;   }   mLocationManager = null;   super.onDestroy();   }   @Override   protected void onPause() {   if (mapManager != null) {   mapManager.stop();   }   super.onPause();   }   @Override   protected void onResume() {   if (mapManager != null) {   mapManager.start();   }   super.onResume();   }   /**  * 根据MyLocationOverlay配置的属性确定是否在地图上显示当前位置  */   @Override   protected boolean isLocationDisplayed() {   return myLocationOverlay.isMyLocationEnabled();   }   /**  * 当位置发生变化时触发此方法  *   * @param location 当前位置  */   @Override   public void onLocationChanged(Location location) {   if (location != null) {   // 将当前位置转换成地理坐标点    final GeoPoint pt = new GeoPoint((int) (location.getLatitude() * 1000000), (int) (location.getLongitude() * 1000000));   // 将当前位置设置为地图的中心    mapController.setCenter(pt);   }   }
}

简单解释:代码中是通过MyLocationOverlay在地图上标记当前所在位置的,通过实现监听器接口com.baidu.mapapi.LocationListener并重写它的onLocationChanged方法来监听位置的变化。(注意LocationListener是baidu map api里的,而不是Android自带的)

3)在AndroidManifest.xml中配置

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:Android="http://schemas.android.com/apk/res/android"   package="com.liufeng.baidumap"   Android:versionCode="1"   Android:versionName="1.0">   <application Android:icon="@drawable/icon" android:label="@string/app_name">   <activity Android:name=".MyLocationActivity" android:label="@string/app_name">   <intent-filter>   <action Android:name="android.intent.action.MAIN" />   <category Android:name="android.intent.category.LAUNCHER" />   </intent-filter>   </activity>   </application>   <uses-sdk Android:minSdkVersion="4" />   <!-- 访问网络的权限 -->   <uses-permission Android:name="android.permission.INTERNET" />   <!-- 访问精确位置的权限 -->   <uses-permission Android:name="android.permission.ACCESS_FINE_LOCATION" />   <!-- 访问网络状态的权限 -->   <uses-permission Android:name="android.permission.ACCESS_NETWORK_STATE" />   <!-- 访问WIFI网络状态的权限 -->   <uses-permission Android:name="android.permission.ACCESS_WIFI_STATE" />   <!-- 改变WIFI网络状态的权限 -->   <uses-permission Android:name="android.permission.CHANGE_WIFI_STATE" />   <!-- 读写存储卡的权限 -->   <uses-permission Android:name="android.permission.WRITE_EXTERNAL_STORAGE" />   <!-- 读取电话状态的权限 -->   <uses-permission Android:name="android.permission.READ_PHONE_STATE" />
</manifest>

到这里,我们的代码编写工作就已经完成了。接下来,再模拟器里运行一下,看看效果,下图是在模拟器里运行的截图:

怎么回事?不是说能够在地图上标注出当前位置的,好像并没有标注。没错,的确是没有标注出当前位置。这是什么原因呢?前面说了,我们要实现的是一个GPS结合Map的简单定位应用。手机的GPS定位是依赖于手机设备上的一块GPS物理芯片来实现的,并不是手机上装个GPS软件就能实现定位的。问题就很明显了,因为我们是在模拟器里运行上面的程序,模拟器上可没有GPS物理芯片,当然也就不能实现定位了。
      好在DDMS为我们提供了模拟GPS信号的功能,它可以通过三种方式来模拟:自定义经纬度、使用GPX文件或KML文件(这些文件是GPS信息记录的文件格式)。依次点击Eclipse上的"Window"-"Show View"-"Other"-"Android"-"Emulator Control",就能够看到如下所示的界面:

这个就是用来模拟GPS信号的。可以看到有三个标签项:Manual、GPX和KML,分别对应于上面所说的“自定义经纬度”、“使用GPX文件”和“使用KML文件”三种方式来模拟GPS信号。这里我们采用第一种方式,因为它最简单,也最直观,好理解。
      我们输入一个经纬度值(经度:106.720397,纬度:26.597239),然后点击“Send”按钮,模拟器将会收到该信号,这意味模拟器设备当前所处的位置正是我们所发送的这个经纬度所代表的位置,这样就能在地图上标记出当前所处位置了。真的是这样吗?那我们赶紧尝试一下。输入经纬度值的截图如下:

点击发送按钮后,再来看下模拟器上显示的地图是否发生变化:

可以看到,已经在地图上标记出了“当前位置”,就是那个蓝色的圆点。到这里我们工作还没有完,请继续往下看。
      最开始的需求里有这样一条:“如果我的位置发生改变,要能够实时在地图上体现出来”,我们的代码里是否已实现该功能呢,当然。那如何来模拟演示该功能呢?其实也很简单,我们再向模拟器发送另外一组不同的经纬度值,这就相当于设备所处的位置发生了改变。比如我们再次发送的经纬度值为“经度:106.720397,纬度:24.597239”,再来看下运行结果的变化:

可以看到,当位置发生变动时,是能够时时体现在地图上的。到这里我们的所有工作就算完成了。

备注:建议如果有条件的朋友,尽量买部Android真机来做开发测试,因为模拟器并不能真实地模拟手机上的所有功能。有很多时候很可能你的程序一点问题也没有,但是由于模拟器不支持或者你不清楚如何通过模拟器来模拟某种功能而导致你反复的调试修改代码,造成不必要的时间浪费。

转载于:https://www.cnblogs.com/eustoma/archive/2012/06/05/2536903.html

百度地图API之MyLocationOverlay的使用(Android)相关推荐

  1. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android) .

    本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...

  2. android 百度地图 itemizedoverlay,[008] 百度地图API之ItemizedOverlay的使用(Android)

    本篇文章主要介绍如何在百度地图上添加Overlay(即图层或覆盖物). Overlay简介 Overlay通常被译为"图层"或"覆盖物".那么对于地图而言,什么 ...

  3. Android百度地图API使用教程

    课1 百度地图应用 百度地图.ppt 百度地图API:API文档 http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_2_0/ 67个类:其中6大核心 ...

  4. Android通过百度地图API用Service和Alarm在后台定时获取地理位置信息

    本文主要介绍了Android项目集成百度地图API,使用AlarmManager定时调用Service,在Service中请求坐标更新,并通过坐标得到省.市和县三级地理位置信息的方法. 程序结构很简单 ...

  5. Android中应用百度地图API开发地图APP实例-显示百度地图

    场景 效果 在使用百度地图API之前需要先在百度地图开放平台中申请API_KEY http://lbsyun.baidu.com/index.php 申请API_KEY 登录百度开放平台后找到控制台下 ...

  6. android应用 百度地图,Android学习之百度地图API的应用(一)

    现在的地图API很多,我就从百度地图开始了,为了方面自己以后回顾,我会把所有学到的东西记录下来,下面是学习记录: 要使用百度地图首先得申请一个KEY,可以到这里申请(需要注册一个百度账号),申请完之后 ...

  7. android应用控制百度地图,Android中应用百度地图API开发地图APP实例-显示百度地图...

    场景 效果 在使用百度地图API之前需要先在百度地图开放平台中申请API_KEY 申请API_KEY 登录百度开放平台后找到控制台下的应用管理-创建应用 依次输入应用名,应用类型选择Android S ...

  8. android 百度地图api密钥,Android百度地图开发获取秘钥之SHA1

    最近在做一个关于百度地图的开发. 不过在正式开发之前还必须要在百度地图API官网里先申请秘钥,而在申请秘钥的过程中,就需要获取一个所谓的SHA1值. 如上所示,但是由于不是正式开发,所以以上的发布版和 ...

  9. android百度地图例子,使用百度地图API进行Android地图应用开发(Eclipse)(示例代码)...

    随着基于位置的服务的兴起,地图类App呈现爆发趋势.随着而来的是地图供应商开放大量的API.供开发人员开发基于PC或者移动端的应用程序. 如今我们研究使用百度地图SDK进行Android项目的开发. ...

最新文章

  1. 第十七届全国大学生完全车模组竞速赛方案 - 草案
  2. MySQL 5.6 解决InnoDB: Error: Table “mysql“.“innodb_table_stats“ not found.问题
  3. php图片等比例压缩,php实现图片上传并等比例压缩
  4. LDA主题模型——gensim实战
  5. 科学家研发机器人混入南极企鹅群 获“友好”对待
  6. python json模块rodas方法_json模块使用总结——Python
  7. Class类---反射学习笔记(一)
  8. HDR 成像技术学习(二)
  9. 初一模拟赛总结(2019.5.25)
  10. 【转载】安卓开发者在使用deepin15.4时可能会遇到的问题
  11. 软件工程第二次作业(原型设计)
  12. 解除Xcode中Miss File的警告
  13. 让程序员爱不释手的两个导航网站
  14. java路径的上一级_java路径两种写法/和\\以及 ./和../以及/之间的区别?
  15. 聚沙成塔——VBA术语 (VBA Glossary)
  16. 初步学习网站分析工具
  17. python脚本编程:批量压缩图片大小
  18. 基于stc51单片机的指纹解锁模块
  19. 科技云报道:从Robot到Cobot,人机共融正在开创一个时代
  20. upc 个人训练赛第三场:排课表(容斥原理+组合数学)

热门文章

  1. Caffe上用SSD训练和测试自己的数据
  2. 第1课 - make和makefile
  3. 三个获取浏览器URL中参数值的方法
  4. Activiti+Oracle,在数据量大的时候报错:无法支持1000列以上
  5. 有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?...
  6. 告诉你KVC的一切-b
  7. 使用celery的backend异步获取结果
  8. 如何寻找高质量流量日入三百+
  9. 转载:页面加载swf插件:swfobject
  10. css3 transform rotate-2D旋转