最近由于项目需要,研究了下百度地图定位,他们提供的实例基本都是用监听器实现自动定位的。我想实现一种效果:当用户进入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"?>
- <LinearLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:orientation="vertical"
- android:layout_width="fill_parent"
- android:layout_height="fill_parent"
- >
- <TextView
- 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.MapViewandroid:id="@+id/bmapsView"
- android:layout_width="fill_parent"android:layout_height="fill_parent"
- android:clickable="true"android:layout_weight="1"
- />
- <Button
- 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,以及其初始化。
- publicBMapManagermapManager=null;
- staticMapApplicationapp;
- publicStringmStrKey="你申请的key值";
- @Override
- publicvoidonCreate(){
- mapManager=newBMapManager(this);
- mapManager.init(mStrKey,newMyGeneralListener());
- }
- @Override
- publicvoidonTerminate(){
- if(mapManager!=null)
- {
- mapManager.destroy();
- mapManager=null;
- }
- super.onTerminate();
- }
- staticclassMyGeneralListenerimplementsMKGeneralListener{
- @Override
- publicvoidonGetNetworkState(intarg0){
- Toast.makeText(MapApplication.app.getApplicationContext(),"您的网络出错啦!",
- Toast.LENGTH_LONG).show();
- }
- @Override
- publicvoidonGetPermissionState(intiError){
- if(iError==MKEvent.ERROR_PERMISSION_DENIED){
- Toast.makeText(MapApplication.app.getApplicationContext(),"您的授权Key不正确!",
- Toast.LENGTH_LONG).show();
- }
- }
- }
- 5、接下来就是按照百度api写定位代码了,使用handler机制去添加定位图层,需要说明的都在注释上了。
- privateBMapManagermBMapMan=null;
- privateMapViewmMapView=null;
- privateMapControllerbMapController;
- privateMKLocationManagermkLocationManager;
- privateMKSearchmkSearch;
- privateTextViewaddress_view;
- privateProgressDialogdialog;
- privateList<HotelInfo>hotelList;
- privateintdistance=1000;
- Handlerhandler=newHandler(){
- @Override
- publicvoidhandleMessage(Messagemsg){
- doublelat=msg.getData().getDouble("lat");
- doublelon=msg.getData().getDouble("lon");
- if(lat!=0&&lon!=0){
- GeoPointpoint=newGeoPoint(
- (int)(lat*1E6),
- (int)(lon*1E6));
- bMapController.animateTo(point);
- bMapController.setZoom(15);
- mkSearch.reverseGeocode(point);
- MyLocationOverlaymyLoc=newMyLocationOverlayFromMap(ShowMapAct.this,mMapView);
- myLoc.enableMyLocation();
- myLoc.enableCompass();
- mMapView.getOverlays().add(myLoc);
- }else{
- Toast.makeText(ShowMapAct.this,"没有加载到您的位置",Toast.LENGTH_LONG).show();
- }
- if(hotelList!=null){
- Drawablemarker=getResources().getDrawable(R.drawable.iconmarka);
- marker.setBounds(0,0,marker.getIntrinsicWidth(),marker.getIntrinsicHeight());
- mMapView.getOverlays().add(newOverItemList(marker,hotelList,ShowMapAct.this,bMapController));
- }elseif(hotelList==null&&lat!=0&&lon!=0){
- Toast.makeText(ShowMapAct.this,"网络异常,没有获取到酒店信息。",Toast.LENGTH_LONG).show();
- }
- if(dialog!=null)dialog.dismiss();
- }
- };
- @Override
- protectedvoidonCreate(BundlesavedInstanceState){
- distance=getIntent().getExtras().getInt("distance");
- super.onCreate(savedInstanceState);
- setContentView(R.layout.location);
- mMapView=(MapView)findViewById(R.id.bmapsView);
- init();
- super.initMapActivity(mBMapMan);
- address_view=(TextView)findViewById(R.id.myLocation_id);
- SpannableStringBuilderstyle=newSpannableStringBuilder(String.format(getResources().getString(R.string.location_text),"位置不详"));
- style.setSpan(newForegroundColorSpan(Color.RED),5,style.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- address_view.setText(style);
- Buttonlocation_button=(Button)findViewById(R.id.location_button_id);
- location_button.setOnClickListener(newView.OnClickListener(){
- @Override
- publicvoidonClick(Viewv){
- dialog=ProgressDialog.show(ShowMapAct.this,"","数据加载中,请稍后.....");
- newThread(newMyThread()).start();
- }
- });
- mkSearch=newMKSearch();
- mkSearch.init(mBMapMan,this);
- mMapView.setBuiltInZoomControls(true);
- bMapController=mMapView.getController();
- GeoPointdefaultPoint=newGeoPoint((int)(39.920934*1E6),(int)(116.412817*1E6));
- bMapController.setCenter(defaultPoint);
- bMapController.setZoom(12);
- mkLocationManager=mBMapMan.getLocationManager();
- }
- publicvoidinit(){
- MapApplicationapp=(MapApplication)getApplication();
- if(app.mapManager==null){
- app.mapManager=newBMapManager(getApplication());
- app.mapManager.init(app.mStrKey,newMapApplication.MyGeneralListener());
- }
- mBMapMan=app.mapManager;
- }
- @Override
- protectedvoidonDestroy(){
- MapApplicationapp=(MapApplication)getApplication();
- if(mBMapMan!=null){
- mBMapMan.destroy();
- app.mapManager.destroy();
- app.mapManager=null;
- mBMapMan=null;
- }
- super.onDestroy();
- }
- @Override
- protectedvoidonPause(){
- if(mBMapMan!=null){
- mBMapMan.stop();
- }
- super.onPause();
- }
- @Override
- protectedvoidonResume(){
- if(mBMapMan!=null){
- mBMapMan.start();
- }
- super.onResume();
- }
- @Override
- protectedbooleanisRouteDisplayed(){
- returnfalse;
- }
- @Override
- publicvoidonGetAddrResult(MKAddrInforesult,intiError){
- if(result==null)return;
- SpannableStringBuilderstyle=newSpannableStringBuilder(String.format(getResources().getString(R.string.location_text),result.strAddr));
- style.setSpan(newForegroundColorSpan(Color.RED),5,style.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- address_view.setText(style);
- if(dialog!=null)dialog.dismiss();
- }
- @Override
- publicvoidonGetDrivingRouteResult(MKDrivingRouteResultarg0,intarg1){}
- @Override
- publicvoidonGetPoiResult(MKPoiResultarg0,intarg1,intarg2){}
- @Override
- publicvoidonGetTransitRouteResult(MKTransitRouteResultarg0,intarg1){}
- @Override
- publicvoidonGetWalkingRouteResult(MKWalkingRouteResultarg0,intarg1){}
- classMyThreadimplementsRunnable{
- @Override
- publicvoidrun(){
- Locationlocation=mkLocationManager.getLocationInfo();
- doublelat=0d,lon=0d;
- if(location!=null){
- Stringcoordinate=location.getLatitude()+","+location.getLongitude();
- HotelRemoteDatahotelData=newHotelRemoteData();
- hotelList=hotelData.getHotelToMap(coordinate,distance);
- lat=location.getLatitude();
- lon=location.getLongitude();
- }
- Messagemsg=newMessage();
- Bundledata=newBundle();
- data.putDouble("lat",lat);
- data.putDouble("lon",lon);
- msg.setData(data);
- handler.sendMessage(msg);
- }
- }
6、还有一种就是百度示例相当推荐的,也是加载定位位置速度比较快的,那就是通过定位监听器来定位信息。没啥难的,照着百度的示例写,都能搞定。
- LocationListenerlistener=newLocationListener(){
- @Override
- publicvoidonLocationChanged(Locationlocation){
- GeoPointgp=newGeoPoint((int)(location.getLatitude()*1E6),(int)(location.getLongitude()*1E6));
- bMapController.animateTo(gp);
- }
- };
分享到:
相关推荐
开发者需要对Android系统、Java编程以及百度地图SDK有一定的理解才能有效地实现手动定位和自动定位功能。通过阅读提供的博客文章,开发者可以获得具体的实现步骤和代码示例,进一步提升自己的开发技能。
自动检索附近地址是利用了百度地图的实时定位功能,结合POI检索。用户开启应用后,系统会获取用户当前的位置信息,然后在一定范围内自动检索附近的POI,无需用户手动输入位置信息。 4. **实现步骤** - **集成百度...
总结来说,Android百度地图开发中的Poi搜索功能,结合自动检索附近地址和小地图自定位,为用户提供了一种高效、便捷的方式来发现和导航至感兴趣的地点。开发者需要熟练掌握百度地图SDK的使用,理解定位、检索和地图...
在Android开发中,集成百度地图API来实现移动设备上的位置获取和自动定位是一项常见的任务。这份"Android应用源码之百度地图移动获取位置,自动定位.rar"压缩包中包含了一个完整的示例项目,用于演示如何在Android...
本篇将详细讲解如何在Android应用中调用百度地图API,并实现自动定位、获取中心位置坐标以及标注地理信息等功能。 首先,我们需要在百度地图开放平台注册一个账号,创建应用并获取API密钥。这个API密钥是连接我们...
在本教程中,我们将深入探讨如何在Android应用中实现百度地图定位功能。首先,我们需要理解“百度地图定位小应用”这个项目的核心概念。 1. **百度地图API** 百度地图提供了丰富的API服务,允许开发者在Android...
【基于百度地图的轨迹显示】是一个Android应用的实例,它展示了如何在百度地图API上实现用户的运动轨迹可视化。这个demo的目的是帮助开发者了解如何利用百度地图服务来收集、存储和展示用户的位置数据,特别是在运动...
本篇文章将深入探讨“百度地图定位”这一主题,包括如何实现地图定位、添加标注以及点聚合功能。 首先,百度地图定位是通过集成百度地图API来获取设备的地理位置信息。百度地图提供了一个强大的定位SDK,支持GPS、...
在本文中,我们将深入探讨如何使用百度地图API创建一个初学者友好的示例应用,该应用能够实现手动定位以及在地图上显示用户当前位置的详细信息。我们将覆盖以下几个关键知识点: 1. **百度地图API**: 百度地图API...
在Android开发中,集成百度地图SDK进行位置服务是常见的需求,尤其在开发涉及地理信息的应用时。"百度定位无地图"这个标题暗示了一个问题:在尝试使用百度地图SDK进行定位时,显示的结果没有地图背景。这可能是由于...
开发者需要考虑如何设计更新机制,例如在有网络时自动下载新的地图数据,或者用户手动触发更新。 8. **性能优化** 对于大型地图数据,性能优化至关重要。开发者应关注数据的预处理、压缩、分块等技术,以减少内存...
通常,百度地图会自动处理这一部分,但在自定义渲染时,你需要手动处理。 5. **交互操作**:可以通过监听地图的事件,如`click`,来实现点击地图获取经纬度坐标的功能。还可以通过API提供的方法进行缩放、平移等...
本项目旨在演示如何在Android应用中手动申请这些危险权限,同时结合了Retrofit2进行网络请求以及百度定位服务的使用。下面将详细介绍这几个关键知识点。 首先,关于Android危险权限的申请,Android 6.0(API级别23...
通过以上步骤,你就能成功地将百度地图的定位功能集成到你的Android应用中。理解并掌握这些知识点对于一个Android开发者来说至关重要,它不仅帮助你实现特定功能,还增强了应用的用户体验。在实际开发过程中,不断...
本文将详细介绍“百度定位Demo”,一个基于百度地图API实现的位置服务示例,旨在帮助开发者快速理解和接入百度定位服务。 一、百度定位服务概述 百度定位服务是百度地图开放平台提供的一项API服务,它能够为开发者...
2. **集成SDK**:将百度地图SDK集成到项目中,可以是Android或iOS应用,或其他支持的平台。 3. **初始化地图**:加载地图视图,设置缩放级别、中心点等参数。 4. **定位服务**:开启定位功能,获取用户当前的位置...
在Android开发中,百度地图API是一个强大的工具,用于在应用程序中集成地图功能。"百度地图PopupOverlay"是其中的一个组件,主要用于在地图上添加可交互的弹出窗口,以展示地图上的特定信息或者进行交互操作。这个...
在这个过程中,开发者通常会利用第三方地图服务SDK,如百度地图SDK,来实现定位功能。 首先,我们来了解一下Android定位的基本原理。Android系统提供了多种定位方式,包括GPS(全球定位系统)、Wi-Fi、移动网络等。...
百度定位SDK是百度为开发者提供的专业定位服务工具包,支持Android和iOS平台。它提供了多种定位方式,包括GPS、WiFi、基站等,并且能够结合多源数据进行智能定位,提高定位精度和速度。此外,该SDK还包含了丰富的...
1. **地图API选择**:Android离线地图的实现通常需要借助地图API,如谷歌地图API、高德地图API或百度地图API。这些API提供了丰富的地图渲染、定位、路线规划等功能,同时也可能提供离线地图的支持。 2. **离线地图...