我在哪儿百度地图经纬度定位api定位

近期评论分类目录
google地图我现在的位置 获取自己的位置信息
  google地图地址传送门:
  网页右下角获取当前位置信息
  google地图返回我的位置界面截图
  授权 Google 地图使用您的位置信息
  如果地图无法以您的位置为中心进行显示,则可能存在以下问题。比如,您可能曾拒绝 Google 地图访问您的位置信息,或者您的浏览器可能发生错误。
  向 Google 地图授予权限
  要使地图以您的位置为中心进行显示,您需要授权 Google 地图获取您的位置信息。
  排查位置相关问题
  如果您收到了错误消息&无法获取您的位置&,那么原因可能有两个:
  页面加载时间过长,因此 Google 地图停止工作。
  我们无法获取您的准确位置信息。
  解决问题
  以下是一些提示:
  刷新浏览器,例如 Chrome 浏览器、Firefox 或 Safari。
  检查并确保互联网连接正常。
  按照上文说明,仔细检查您的权限设置。Android应用中使用百度地图API定位自己的位置(二) - 推酷
Android应用中使用百度地图API定位自己的位置(二)
官方文档:
百度地图SDK为开发者们提供了如下类型的地图覆盖物:
我的位置图层(MyLocationOverlay):用于显示用户当前位置的图层(支持自定义位置图标);
Poi搜索结果图层(PoiOverlay):用于显示兴趣点搜索结果的图层;
路线图层(RouteOverlay):公交、步行和驾车线路图层,将公交、步行和驾车出行方案的路线及关键点显示在地图上(起、终点图标用户可自定义);
公交换乘图层(TransitOverlay):公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上(起、终点图标用户可自定义);
自定义图层(ItemizedOverlay):可将一个或多个兴趣点绘制到地图上,且支持自定义图标(支持动态更新Item位置、图标);
弹出窗图层(PopupOverlay):在地图上显示一个弹出窗口;
几何图形绘制图层(GraphicsOverlay):用于绘制点、折线段、弧线、圆、矩形、多边形等几何图形的图层;
文字绘制图层(TextOverlay):用于绘制文字的图层。
图片图层(GroundOverlay):用于展示用户传入图片的图层。
全景图图层(PanoramaOverlay):在全景图内标绘兴趣点,支持自定义图标样式。
注:除弹出窗图层外,其他各个图层均已实现多实例。全景图图层是针对全景图所使用的特殊图层。
MapView使用一个List管理覆盖物,通过向MapView.getOverlays() add或remove上述类或其基类的实例即可向地图添加或删除覆盖物。在更新地图覆盖物后,需调用MapView.refresh() 使更新生效。
使用百度Android定位SDK必须注册GPS和网络使用权限。定位SDK采用GPS、基站、Wi-Fi信号进行定位。当应用程序向定位SDK发起定位请求时,定位SDK会根据应用的定位因素(GPS、基站、Wi-Fi信号)的实际情况(如是否开启GPS、是否连接网络、是否有信号等)来生成相应定位依据进行定位。
用户可以设置满足自身需求的定位依据:
若用户设置GPS优先,则优先使用GPS进行定位,如果GPS定位未打开或者没有可用位置信息,且网络连接正常,定位SDK则会返回网络定位(即Wi-Fi与基站)的最优结果。为了使获得的网络定位结果更加精确,请打开手机的Wi-Fi开关。
下面我们将利用 &
MyLocationOverlay 和 & PopupOverlay& 这两个类
一 . 导入库文件
在使用百度定位SDKv4.0之前,我们要下载最新的库文件,下载地址:
,将liblocSDK4.so文件拷贝到libs/armeabi目录下。将locSDK4.0.jar文件拷贝到工程的libs目录下
目录结构如下:
库文件下载地址:
二 . 布局文件,一个百度地图控件,加一个手动点击实现定位的按钮
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
&com.baidu.mapapi.map.MapView
android:id=&@+id/bmapView&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:clickable=&true&
android:id=&@+id/request&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:layout_alignParentRight=&true&
android:layout_alignParentTop=&true&
android:layout_marginRight=&10dp&
android:layout_marginTop=&10dip&
android:background=&@drawable/mylocation&
&/RelativeLayout& 然后是主 Activity
package com.majianjie.
import android.app.A
import android.graphics.B
import android.graphics.drawable.D
import android.os.B
import android.view.LayoutI
import android.view.M
import android.view.MenuI
import android.view.V
import android.view.View.MeasureS
import android.widget.B
import android.widget.TextV
import android.widget.T
import com.baidu.location.BDL
import com.baidu.location.BDLocationL
import com.baidu.location.LocationC
import com.baidu.location.LocationClientO
import com.baidu.mapapi.BMapM
import com.baidu.mapapi.MKGeneralL
import com.baidu.mapapi.map.LocationD
import com.baidu.mapapi.map.MKE
import com.baidu.mapapi.map.MKMapViewL
import com.baidu.mapapi.map.MapC
import com.baidu.mapapi.map.MapP
import com.baidu.mapapi.map.MapV
import com.baidu.mapapi.map.MyLocationO
import com.baidu.mapapi.map.PopupClickL
import com.baidu.mapapi.map.PopupO
import com.api.basestruct.GeoP
import com.example.baidumap.R;
public class MainActivity extends Activity {
//声明控件
private Toast mToast=
private BMapManager mBMapManager=
private MapView mMapView =
//MapView 是地图主控件
private MapController mMapController =//用MapController完成地图控制
private LocationClient mLocC
public LocationData mLocData =
private LocationOverlay myLocationOverlay =//定位图层
private boolean isRequest =//是否手动触发请求定位
private boolean isFirstLoc =//是否首次定位
private PopupOverlay mPopupOverlay
=//弹出泡泡图层,浏览节点时使用
private View viewCache=
public BDLocation location = new BDLocation();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//**使用地图sdk前需先初始化BMapManager,这个必须在setContentView()先初始化
mBMapManager = new BMapManager(this);
//第一个参数是API key,
第二个参数是常用事件监听,用来处理通常的网络错误,授权验证错误等,你也可以不添加这个回调接口
mBMapManager.init(&LDtH1sVwr7kygaF0aTqaVwWU&, new MKGeneralListener() {
//授权错误的时候调用的回调函数
public void onGetPermissionState(int iError) {
if (iError ==
MKEvent.ERROR_PERMISSION_DENIED) {
showToast(&API KEY错误, 请检查!&);
//一些网络状态的错误处理回调函数
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(getApplication(), &您的网络出错啦!&, Toast.LENGTH_LONG).show();
//单击事件
//* 显示Toast消息
private void showToast(String msg){
if(mToast == null){
mToast = Toast.makeText(this, msg, Toast.LENGTH_SHORT);
mToast.setText(msg);
mToast.setDuration(Toast.LENGTH_SHORT);
mToast.show();
private void click() {
request.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
requestLocation();
protected void onResume() {
//MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
mMapView.onResume();
mBMapManager.start();//重新启动
super.onResume();
protected void onPause() {
//MapView的生命周期与Activity同步,当activity挂起时需调用MapView.onPause()
mMapView.onPause();
super.onPause();
private void init() {
//使用自定义的title,注意顺序
setContentView(R.layout.activity_main);
//activity的布局
//这里是添加自己定义的titlebtn.xml
//通过id找到他们
mMapView = (com.baidu.mapapi.map.MapView) findViewById(R.id.bmapView);
mMapController=mMapView.getController(); //获取地图控制器
mMapController.enableClick(true);
//设置地图是否响应点击事件
request=(Button)findViewById(R.id.request);
viewCache = LayoutInflater.from(this).inflate(R.layout.pop_layout, null);
mPopupOverlay= new PopupOverlay(mMapView, new PopupClickListener() {// * 点击弹出窗口图层回调的方法
public void onClickedPopup(int arg0) {
//隐藏弹出窗口图层
mPopupOverlay.hidePop();
mMapController.enableClick(true);
设置地图是否响应点击事件
mMapController.setZoom(12);
// * 设置地图缩放级别
mMapView.setBuiltInZoomControls(true);
// * 显示内置缩放控件
mMapView.setTraffic(true);
mLocData = new LocationData();
mLocClient = new LocationClient(getApplicationContext());
* 定位SDK的核心类
//实例化定位服务,LocationClient类必须在主线程中声明
mLocClient.registerLocationListener(new BDLocationListenerImpl());//注册定位监听接口
* 设置定位参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); //打开GPRS
option.setAddrType(&all&);//返回的定位结果包含地址信息
option.setCoorType(&bd09ll&);//返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000); //设置发起定位请求的间隔时间为5000ms
option.disableCache(false);//禁止启用缓存定位
option.setPoiNumber(5);
//最多返回POI个数
option.setPoiDistance(1000); //poi查询距离
option.setPoiExtraInfo(true);
//是否需要POI的电话和地址等详细信息
mLocClient.setLocOption(option);
mLocClient.start();
// 调用此方法开始定位
myLocationOverlay = new LocationOverlay(mMapView);//定位图层初始化
//将定位数据设置到定位图层里
myLocationOverlay.setMarker(getResources().getDrawable(R.drawable.set));
//添加定位图层
mMapView.getOverlays().add(myLocationOverlay);
myLocationOverlay.enableCompass();
//更新图层数据执行刷新后生效
mMapView.refresh();
//准备要添加的Overlay
double mLat1 = 39.910159;
double mLon1 = 119.544697;
// 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)
GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));
//准备overlay图像数据,根据实情情况修复
Drawable mark= getResources().getDrawable(R.drawable.set);
//用OverlayItem准备Overlay数据
OverlayItem item1 = new OverlayItem(p1,&item1&,&item1&);
//使用setMarker()方法设置overlay图片,如果不设置则使用构建ItemizedOverlay时的默认设置
//创建IteminizedOverlay
CustomItemizedOverlay itemOverlay = new CustomItemizedOverlay(mark, mMapView);
//将IteminizedOverlay添加到MapView中
mMapView.getOverlays().clear();
mMapView.getOverlays().add(itemOverlay);
//现在所有准备工作已准备好,使用以下方法管理overlay.
//添加overlay, 当批量添加Overlay时使用addItem(List&OverlayItem&)效率更高
itemOverlay.addItem(item1);
//删除overlay .
//itemOverlay.removeItem(itemOverlay.getItem(0));
//mMapView.refresh();
//清除overlay
// itemOverlay.removeAll();
// mMapView.refresh();
mMapView.refresh();
// mMapController.setCenter(p1);
mMapView.regMapViewListener(mBMapManager, new MKMapViewListener() {
// * 地图移动完成时会回调此接口 方法
public void onMapMoveFinish() {
showToast(&地图移动完毕!&);
//* 地图加载完毕回调此接口方法
public void onMapLoadFinish() {
showToast(&地图载入完毕!&);
地图完成带动画的操作(如: animationTo())后,此回调被触发
public void onMapAnimationFinish() {
//当调用过 mMapView.getCurrentMap()后,此回调会被触发
可在此保存截图至存储设备
public void onGetCurrentMap(Bitmap arg0) {
//* 点击地图上被标记的点回调此方法
public void onClickMapPoi(MapPoi arg0) {
if (arg0 != null){
showToast(arg0.strText);
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
CreateMenu(menu);
private void CreateMenu(Menu menu){
MenuItem mnu1 =menu.add(0,0,0,&显示卫星地图&);
mnu1.setAlphabeticShortcut('a');//设置快捷键
//mnu1.serIcon(R.drawable.icon);//设置图片
MenuItem mnu2 =menu.add(0,1,1,&显示街道地图&);
mnu2.setAlphabeticShortcut('b');//设置快捷键
//mnu1.serIcon(R.drawable.icon);//设置图片
MenuItem mnu3 =menu.add(0,2,2,&3D地图&);
mnu3.setAlphabeticShortcut('c');//设置快捷键
//mnu1.serIcon(R.drawable.icon);//设置图片
public boolean onOptionsItemSelected(MenuItem item) {
if(item.getItemId() == 0){
mMapView.setSatellite(true);
//设置显示为卫星地图:
mMapView.setTraffic(false);
}else if(item.getItemId() == 1){
mMapView.setTraffic(true);
//显示街道地图
mMapView.setSatellite(false);
}else if(item.getItemId() == 2){
//mMapView.se
public class BDLocationListenerImpl implements BDLocationListener {
* 接收异步返回的定位结果,参数是BDLocation类型参数
public void onReceiveLocation(BDLocation location) {
if (location == null) {
StringBuffer sb = new StringBuffer(256);
sb.append(&time : &);
sb.append(location.getTime());
sb.append(&\nerror code : &);
sb.append(location.getLocType());
sb.append(&\nlatitude : &);
sb.append(location.getLatitude());
sb.append(&\nlontitude : &);
sb.append(location.getLongitude());
sb.append(&\nradius : &);
sb.append(location.getRadius());
if (location.getLocType() == BDLocation.TypeGpsLocation){
sb.append(&\nspeed : &);
sb.append(location.getSpeed());
sb.append(&\nsatellite : &);
sb.append(location.getSatelliteNumber());
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation){
sb.append(&\naddr : &);
sb.append(location.getAddrStr());
MainActivity.this.location =
mLocData.latitude = location.getLatitude();
mLocData.longitude = location.getLongitude();
//如果不显示定位精度圈,将accuracy赋值为0即可
mLocData.accuracy = location.getRadius();
mLocData.direction = location.getDerect();
//将定位数据设置到定位图层里
myLocationOverlay.setData(mLocData);
//更新图层数据执行刷新后生效
mMapView.refresh();
if(isFirstLoc || isRequest){
//将给定的位置点以动画形式移动至地图中心
mMapController.animateTo(new GeoPoint(
(int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6)));
showPopupOverlay(location);
//载入时候就弹出
isRequest =
isFirstLoc =
// 接收异步返回的POI查询结果,参数是BDLocation类型参数
public void onReceivePoi(BDLocation poiLocation) {
private void requestLocation() {
isRequest =
if(mLocClient != null && mLocClient.isStarted()){
showToast(&正在定位......&);
mLocClient.requestLocation();
//继承MyLocationOverlay重写dispatchTap方法
private class LocationOverlay extends MyLocationOverlay{
public LocationOverlay(MapView arg0) {
super(arg0);
* 在“我的位置”坐标上处理点击事件。
protected boolean dispatchTap() {
//点击我的位置显示PopupOverlay
showPopupOverlay(location);
return super.dispatchTap();
public void setMarker(Drawable arg0) {
super.setMarker(arg0);
protected void onDestroy() {
//MapView的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()
mMapView.destroy();
//退出应用调用BMapManager的destroy()方法
if(mBMapManager != null){
mBMapManager.destroy();
mBMapManager =
//退出时销毁定位
if (mLocClient != null){
mLocClient.stop();
super.onDestroy();
//* 显示弹出窗口图层PopupOverlay
private void showPopupOverlay(BDLocation location){
TextView popText = ((TextView)viewCache.findViewById(R.id.location_tips));
popText.setText(&[我的位置]\n& + location.getAddrStr());
mPopupOverlay.showPopup(getBitmapFromView(popText),
new GeoPoint((int)(location.getLatitude()*1e6), (int)(location.getLongitude()*1e6)),
// * 将View转换成Bitmap的方法
public static Bitmap getBitmapFromView(View view) {
view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
view.buildDrawingCache();
Bitmap bitmap = view.getDrawingCache();
大家注意:这里我把上一次的添加marker的代码注释了,原因是当我这两个同时弄的时候会无法给当前位置添加标记。。。这个问题稍后会得到解决。
下面的布局文件是弹出框的布局,一个 很简单的文件:pop_layout.xml
&?xml version=&1.0& encoding=&utf-8&?&
&RelativeLayout xmlns:android=&/apk/res/android&
android:layout_width=&fill_parent&
android:layout_height=&fill_parent&
android:id=&@+id/location_tips&
android:layout_width=&wrap_content&
android:layout_height=&wrap_content&
android:background=&@drawable/location_tips&
android:maxWidth=&200.0dip&
android:minWidth=&40.0dip&
android:textColor=&@android:color/white& /&
&/RelativeLayout&
LocationClient& 定位SDK的核心类,LocationClient类必须在主线程中声明。需要Context类型的参数。Context需要时全进程有效的context,推荐用getApplicationConext获取全进程有效的context,我们调用registerLocationListener(BDLocationListener)方法来注册定位监听接口,
BDLocationListener里面有两个方法,onReceiveLocation()(接收异步返回的定位结果),onReceivePoi()(接收异步返回的POI查询结果, POI是“Point of Interest”的缩写,可以翻译成“信息点”,每个POI包含四方面信息,名称、类别、经度、纬度、附近的酒店、饭店,商铺等信息。我们可以叫它为“导航地图信息”,导航地图数据是整个导航产业的基石 ),我们这里只需要重写
onReceiveLocation就行了
BDLocation& 封装了定位SDK的定位结果,在BDLocationListener的onReceive方法中获取。通过该类用户可以获取error code,位置的坐标,精度半径,地址等信息,对于其getLocType ()方法获取的error code一些情况
61 : GPS定位结果
62 : 扫描整合定位依据失败。此时定位结果无效。
63 : 网络异常,没有成功向服务器发起请求。此时定位结果无效。
65 : 定位缓存的结果。
66 : 离线定位结果。通过requestOfflineLocaiton调用时对应的返回结果
67 : 离线定位失败。通过requestOfflineLocaiton调用时对应的返回结果
68 : 网络连接失败时,查找本地离线定位时对应的返回结果
161: 表示网络定位结果
162~167: 服务端定位失败
LocationClientOption 用来设置定位SDK的定位方式,比如设置打开GPS,设置是否需要地址信息,设置发起定位请求的间隔时间等等,参数设置完后调用 LocationClient 的setLocOption方法
LocationOverlay & MyLocationOverlay的子类,重写里面的 dispatchTap()方法, 显示弹出窗口图层PopupOverlay,调用 mMapView.getOverlays().add(myLocationOverlay)就将我的位置图层添加到地图里面
PopupOverlay 弹出图层,这个类还是比较简单,里面只有三个方法, hidePop() (隐藏弹出图层) showPopup(Bitmap pop, GeoPoint point, int yOffset) (显示弹出图层)和 showPopup显示多张图片的重载方法,由于 showPopup方法只接受Bitmap对象,所以我们必须将我们的弹出图层View对象转换成Bitmap对象,我们调用 getBitmapFromView方法就实现这一转换
BDLocationListener接口的 onReceiveLocation(BDLocation location) 方法我还要重点讲解下,我们会发现 onReceiveLocation方法会反复执行,他执行的间隔跟 LocationClientOption类的 setScanSpan()方法设定的值有关,我们设定的是5000毫秒,则 onReceiveLocation方法每隔5秒执行一次,注意,当我们设定的值大于1000(ms), 定位SDK内部使用定时定位模式。调用requestLocation( )后,每隔设定的时间,定位SDK就会进行一次定位。如果定位SDK根据定位依据发现位置没有发生变化,就不会发起网络请求,返回上一次定位的结果;如果发现位置改变,就进行网络请求进行定位,得到新的定位结果。如果你只需要定位一次的话,这个设置小于1000,或者不用设置就可以了,定时定位时,调用一次requestLocation,会定时监听到定位结果
四 . 在运行程序之前,我们还必须在AndroidManifest.xml进行相关配置和权限的声明
&span style=&color:#ff6666;&& &/span&&span style=&color:#333333;&&
&uses-permission android:name=&android.permission.ACCESS_COARSE_LOCATION& /&
&uses-permission android:name=&android.permission.ACCESS_FINE_LOCATION& /&
&uses-permission android:name=&android.permission.ACCESS_WIFI_STATE& /&
&uses-permission android:name=&android.permission.ACCESS_NETWORK_STATE&/&
&uses-permission android:name=&android.permission.CHANGE_WIFI_STATE& /&
&uses-permission android:name=&android.permission.READ_PHONE_STATE& /&
&uses-permission android:name=&android.permission.WRITE_EXTERNAL_STORAGE& /&
&uses-permission android:name=&android.permission.INTERNET& /&
&uses-permission android:name=&android.permission.MOUNT_UNMOUNT_FILESYSTEMS& /&
&uses-permission android:name=&android.permission.READ_LOGS& /&&/span& 还有很重要的一点就是在
AndroidManifest.xml中 添加下面的内容
&service &
& & & & & & android:name=&com.baidu.location.f& &
& & & & & & android:enabled=&true& &
& & & & & & android:process=&:remote& & &
& & & & &/service&&
& & & & &meta-data
& & & & & & android:name=&com.baidu.lbsapi.API_KEY&
& & & & & & android:value=&6KOX4mXHeBRzgriV6OP1T2Hw&&
& & & & & & /&
& & & & &!-- 致命的一句 --&
其中的meta-data问题:网上这样说,大家记住就得了。。。。
因为单独的定位sdk需要一个key值,而定位sdk的值又不像mapManager中可以直接赋值
所以就需要在注册表单中注册
运行图示:
部分内容摘自百度官方文档。部分来自博客:
定位自己的位置基本就这些内容,出现的问题随后会补充上。。今天就这样吧。。吃饭去了。。
已发表评论数()
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见
正文不准确
标题不准确
排版有问题
主题不准确
没有分页内容
图片无法显示
视频无法显示
与原文不一致百度地图的手动定位和自动定位 - aokunsang - ITeye技术网站
博客分类:
最近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的。我想实现一种效果:当用户进入UI时,不定位,用户需要定位的时候,自己手动点击按钮,再去定位当前位置。
经过2天研究和咨询,找到了解决方案,在此备忘一下。
注意:定位使用真机才能够真正定位;模拟器的话,在DDMS中的Emulator Control中,选择Manual,下面单选按钮选择Decimal,然后填写经纬度,send后,再点击定位我的位置按钮,就能定位了(这应该算是固定定位,哈哈。。。)、
亲,有问题点击联系我哦。
1、第一步当然是获取一个针对自己项目的key值。/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"?&
&LinearLayout
xmlns:android="/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/myLocation_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="15dp"
android:gravity="center_horizontal"
android:textColor="@drawable/black"
android:background="@drawable/gary"
&com.baidu.mapapi.MapView android:id="@+id/bmapsView"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:clickable="true"
android:layout_weight="1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/location_button_id"
android:text="@string/location_button_text"
&/LinearLayout&
需要特别注意的是:&com.baidu.mapapi.MapView
/& 这玩意。
4、写一个MapApplication实现application,提供全局的BMapManager,以及其初始化。
public BMapManager mapManager =
static MapA
public String mStrKey = "你申请的key值";
public void onCreate() {
mapManager = new BMapManager(this);
mapManager.init(mStrKey, new MyGeneralListener());
//建议在您app的退出之前调用mapadpi的destroy()函数,避免重复初始化带来的时间消耗
public void onTerminate() {
// TODO Auto-generated method stub
if(mapManager != null)
mapManager.destroy();
mapManager =
super.onTerminate();
static class MyGeneralListener implements MKGeneralListener{
public void onGetNetworkState(int arg0) {
Toast.makeText(MapApplication.app.getApplicationContext(), "您的网络出错啦!",
Toast.LENGTH_LONG).show();
public void onGetPermissionState(int iError) {
if (iError ==
MKEvent.ERROR_PERMISSION_DENIED) {
// 授权Key错误:
Toast.makeText(MapApplication.app.getApplicationContext(),"您的授权Key不正确!",
Toast.LENGTH_LONG).show();
5、接下来就是按照百度api写定位代码了,使用handler机制去添加定位图层,需要说明的都在注释上了。
private BMapManager mBMapMan =
private MapView mMapView =
private MapController bMapC
private MKLocationManager mkLocationM
private MKSearch mkS
private TextView address_
//定位到的位置信息
private ProgressD
private List&HotelInfo& hotelL
private int distance = 1000;
//查询的范围(单位:m)
Handler handler = new Handler(){
public void handleMessage(Message msg) {
double lat = msg.getData().getDouble("lat");
double lon = msg.getData().getDouble("lon");
if(lat!=0&&lon!=0){
GeoPoint point = new GeoPoint(
(int) (lat * 1E6),
(int) (lon * 1E6));
bMapController.animateTo(point);
//设置地图中心点
bMapController.setZoom(15);
mkSearch.reverseGeocode(point);
//解析地址(异步方法)
MyLocationOverlay myLoc = new MyLocationOverlayFromMap(ShowMapAct.this,mMapView);
myLoc.enableMyLocation();
// 启用定位
myLoc.enableCompass();
// 启用指南针
mMapView.getOverlays().add(myLoc);
Toast.makeText(ShowMapAct.this, "没有加载到您的位置", Toast.LENGTH_LONG).show();
if(hotelList!=null){
Drawable marker = getResources().getDrawable(R.drawable.iconmarka);
//设置marker
marker.setBounds(0, 0, marker.getIntrinsicWidth(), marker.getIntrinsicHeight());
//为maker定义位置和边界
mMapView.getOverlays().add(new OverItemList(marker,hotelList,ShowMapAct.this,bMapController));
}else if(hotelList==null&&lat!=0&&lon!=0){
Toast.makeText(ShowMapAct.this, "网络异常,没有获取到酒店信息。", Toast.LENGTH_LONG).show();
if(dialog!=null)
dialog.dismiss();
protected void onCreate(Bundle savedInstanceState) {
distance = getIntent().getExtras().getInt("distance");
//获取查询范围
super.onCreate(savedInstanceState);
setContentView(R.layout.location);
mMapView = (MapView)findViewById(R.id.bmapsView);
//初始化一个mapView
//初始化地图管理器
super.initMapActivity(mBMapMan);
address_view = (TextView)findViewById(R.id.myLocation_id);
SpannableStringBuilder style = new SpannableStringBuilder(String.format(getResources().getString(R.string.location_text),"位置不详"));
style.setSpan(new ForegroundColorSpan(Color.RED), 5, style.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
address_view.setText(style);
Button location_button = (Button)findViewById(R.id.location_button_id);
location_button.setOnClickListener(new View.OnClickListener(){
public void onClick(View v) {
dialog = ProgressDialog.show(ShowMapAct.this, "", "数据加载中,请稍后.....");
new Thread(new MyThread()).start();
mkSearch = new MKSearch();
//初始化一个MKSearch,根据location解析详细地址
mkSearch.init(mBMapMan, this);
mMapView.setBuiltInZoomControls(true);
//启用内置的缩放控件
bMapController = mMapView.getController();
GeoPoint defaultPoint = new GeoPoint((int) (39.920934 * 1E6),(int) (116.412817 * 1E6));
//用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
bMapController.setCenter(defaultPoint);
//设置地图中心点
bMapController.setZoom(12);
//设置地图zoom级别
mkLocationManager = mBMapMan.getLocationManager();
* 初始化地图管理器BMapManager
public void init(){
MapApplication app = (MapApplication)getApplication();
if (app.mapManager == null) {
app.mapManager = new BMapManager(getApplication());
app.mapManager.init(app.mStrKey, new MapApplication.MyGeneralListener());
mBMapMan = app.mapM
protected void onDestroy() {
MapApplication app = (MapApplication)getApplication();
if (mBMapMan != null) {
mBMapMan.destroy();
app.mapManager.destroy();
app.mapManager =
mBMapMan =
super.onDestroy();
protected void onPause() {
if (mBMapMan != null) {
// 终止百度地图API
mBMapMan.stop();
super.onPause();
protected void onResume() {
if (mBMapMan != null) {
// 开启百度地图API
mBMapMan.start();
super.onResume();
protected boolean isRouteDisplayed() {
public void onGetAddrResult(MKAddrInfo result, int iError) {
if(result==null)
SpannableStringBuilder style = new SpannableStringBuilder(String.format(getResources().getString(R.string.location_text),result.strAddr));
style.setSpan(new ForegroundColorSpan(Color.RED), 5, style.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
address_view.setText(style);
if(dialog!=null) dialog.dismiss();
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) {}
public void onGetPoiResult(MKPoiResult arg0, int arg1, int arg2) {}
public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) {}
public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) {}
* 重新定位,加载数据
* @author Administrator
class MyThread implements Runnable{
public void run() {
* 最重要的就是这个玩意
* 由于LocationListener获取第一个位置修正的时间会很长,为了避免用户等待,
* 在LocationListener获取第一个更精确的位置之前,应当使用getLocationInfo() 获取一个缓存的位置
Location location = mkLocationManager.getLocationInfo();
double lat = 0d,lon = 0d;
if(location!=null){
//定位到位置
String coordinate = location.getLatitude()+","+location.getLongitude();
HotelRemoteData hotelData = new HotelRemoteData();
* 远程获取酒店列表数据
hotelList = hotelData.getHotelToMap(coordinate,distance);
lat = location.getLatitude();
lon = location.getLongitude();
Message msg = new Message();
Bundle data = new Bundle();
data.putDouble("lat", lat);
data.putDouble("lon", lon);
msg.setData(data);
handler.sendMessage(msg);
6、还有一种就是百度示例相当推荐的,也是加载定位位置速度比较快的,那就是通过定位监听器来定位信息。没啥难的,照着百度的示例写,都能搞定。
LocationListener listener = new LocationListener() {
/** 位置变化,百度地图即会调用该方法去获取位置信息。
* (我测试发现就算手机不动,它也会偶尔重新去加载位置;只要你通过重力感应,他就一定会重新加载)
public void onLocationChanged(Location location) {
GeoPoint gp =
new GeoPoint((int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6));
//通过地图上的经纬度转换为地图上的坐标点
bMapController.animateTo(gp);
//动画般的移动到定位的位置
(583.6 KB)
下载次数: 1054
浏览 44533
:D 不错,看看,需要[*][/list][/img][/img][/img][/url][/flash][/flash][/flash][/flash]||||||||||||||||||||||||||||||||||||&
博主,能给我发一份文件吗& ??邮箱:这个应该是几年前做的东西了,源码已没有。不过百度的API现在搞的很齐全,仿照着应该很好做。
浏览: 520091 次
来自: 北京
不错,谢谢分享!推荐个参考视频内容:http://www.ro ...
完全正确,补充一下&beans:bean id=&quo ...
longToip直接用ipToLong反过来就好了 publi ...
[size=x-small]jatoolsPrinter还有破 ...

我要回帖

更多关于 中国的卫星定位 的文章

 

随机推荐