(转)Android百度地图之位置定位和附近查找代码简单实现 (上)

原地址:http://blog.csdn.net/eastmount/article/details/42064123


很长时间没有做Android相关知识了,闲暇之余再弄了弄最新的百度地图API,主要是进行百度地图附近餐馆查找功能来练练手,同时熟悉下最新的API教程。文章比较基础,也希望对你有所帮助~参考前文:
        [android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
        [android] 百度地图开发 (二).定位城市位置和城市POI搜索
        [android] 百度地图开发 (三).定位当前位置及getLastKnownLocation总为空问题
        官方网址:http://developer.baidu.com/map/
        Demo下载地址:


一. 配置百度API环境


        获取百度地图API Key前,遇到的第一个问题是“小米手机或豌豆荚不能识别USB插口”。解决方法是安装QuickShortcutMaker软件,输入USB启动计算机USB连接。
        参考地址:http://www.miui.com/thread-1733895-1-1.html

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第1张图片   (转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第2张图片

        百度地图AndroidSDK介绍如下:
        http://developer.baidu.com/map/wiki/index.php?title=androidsdk

        第一步:创建百度地图API Key
        在使用之前,您需要先申请密钥,且密钥和应用证书和包名绑定。
        申请应用新地址:http://lbsyun.baidu.com/apiconsole/key
        百度地图Android SDK申请密钥Key方法如下,也可参照我以前写过的一篇文章:
        http://developer.baidu.com/map/index.php?title=androidsdk/guide/key
        http://blog.csdn.net/eastmount/article/details/42064123

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第3张图片

        其中数字签名SHA1通过点击Eclipse的 "窗体(Window)->首选项(Preferences)->Android->Build" 查看,而包名是创建工程BaiduMapRes项目中的包。

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第4张图片


        第二步:下载Android SDK并配置
        Android SDK v3.1.0下载地址:
        http://developer.baidu.com/map/sdkandev-download.htm
        最新下载地址,可以选择自己喜欢的开发资源,它会提供相应的文件包:
        http://lbsyun.baidu.com/sdk/download

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第5张图片

        在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下,拷贝完成后的工程目录如下图所示:

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第6张图片   (转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第7张图片

        同时需要导入jar包,右键工程->"Properties(属性)"->"Java构建路径",选择添加JAR,选定baidumapapi_vX_X_X.jar,确定后返回。


二. Hello BaiduMapAndroid SDK


         第一个百度地图程序参考网址,简单进行叙述下:Hello BaiduMapAndroid


          第一步: 在AndroidManifest中添加开发密钥、所需权限等信息
         在application中添加开发密钥 
<application ><meta-data />application> 并添加相关权限。
[html]  view plain  copy
  1. xml version="1.0" encoding="utf-8"?>  
  2. <manifest xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     package="com.example.baidumapres"  
  4.     android:versionCode="1"  
  5.     android:versionName="1.0" >  
  6.   
  7.     <uses-sdk  
  8.         android:minSdkVersion="19"  
  9.         android:targetSdkVersion="19" />  
  10.       
  11.         
  12.     <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    
  13.         
  14.     <uses-permission android:name="android.permission.INTERNET" />    
  15.         
  16.     <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />    
  17.     <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    
  18.         
  19.     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />    
  20.     <uses-permission android:name="android.permission.WRITE_SETTINGS" />    
  21.         
  22.     <uses-permission android:name="android.permission.READ_PHONE_STATE" />    
  23.     <uses-permission android:name="android.permission.CALL_PHONE" />    
  24.         
  25.     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />    
  26.         
  27.     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />    
  28.         
  29.     <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />    
  30.     <uses-permission android:name="android.permission.ACCESS_GPS" />  
  31.     <uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />  
  32.     <uses-permission android:name="android.permission.WAKE_LOCK"/>   
  33.     <uses-permission android:name="android.permission.GET_TASKS" />   
  34.       
  35.     <application  
  36.         android:allowBackup="true"  
  37.         android:icon="@drawable/ic_launcher"  
  38.         android:label="@string/app_name"  
  39.         android:theme="@style/AppTheme" >  
  40.           
  41.         <meta-data    
  42.             android:name="com.baidu.lbsapi.API_KEY"    
  43.             android:value="OYl0tcWvGrWtWucQN2rhdxG8" />    
  44.               
  45.         <activity  
  46.             android:name="com.example.baidumapres.MainActivity"  
  47.             android:label="@string/app_name" >  
  48.             <intent-filter>  
  49.                 <action android:name="android.intent.action.MAIN" />  
  50.   
  51.                 <category android:name="android.intent.category.LAUNCHER" />  
  52.             intent-filter>  
  53.         activity>  
  54.     application>  
  55.       
  56. manifest>  

        第二步:在布局xml文件中添加地图控件
        布局文件activity_main.xml中通过加载百度地图控件MapView,它是由百度提供的自定义控件故需要加上完整包名,同时该控件需要接受点击事件clickable设置为true。
[html]  view plain  copy
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:id="@+id/container"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     tools:context="com.example.baidumapres.MainActivity"  
  7.     tools:ignore="MergeRootFrame" >  
  8.       
  9.     <com.baidu.mapapi.map.MapView    
  10.         android:id="@+id/map_view"    
  11.         android:layout_width="match_parent"    
  12.         android:layout_height="match_parent"    
  13.         android:clickable="true" />    
  14.     
  15. FrameLayout>    

        第三步: MainActivity.java文件,创建地图Activity,管理地图生命周期
[java]  view plain  copy
  1. package com.example.baidumapres;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import com.baidu.mapapi.SDKInitializer;  
  6. import com.baidu.mapapi.map.BaiduMap;  
  7. import com.baidu.mapapi.map.MapView;  
  8. import com.baidu.mapapi.map.OverlayOptions;  
  9. import com.baidu.mapapi.map.PolygonOptions;  
  10. import com.baidu.mapapi.map.Stroke;  
  11. import com.baidu.mapapi.model.LatLng;  
  12. import android.app.Activity;  
  13. import android.os.Bundle;  
  14.   
  15. public class MainActivity extends Activity {  
  16.       
  17.     //地图  
  18.     private MapView mMapView = null;    
  19.     private BaiduMap mBaiduMap;  
  20.       
  21.     @Override    
  22.     protected void onCreate(Bundle savedInstanceState) {    
  23.         super.onCreate(savedInstanceState);     
  24.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext    
  25.         //注意该方法要再setContentView方法之前实现    
  26.         SDKInitializer.initialize(getApplicationContext());    
  27.         setContentView(R.layout.activity_main);    
  28.           
  29.         //获取地图控件引用    
  30.         mMapView = (MapView) findViewById(R.id.map_view);    
  31.           
  32.         /* 
  33.          * 设置地图类型 普通地图 
  34.          * 卫星地图  
  35.          * mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);    
  36.          * 开启交通图    
  37.          * mBaiduMap.setTrafficEnabled(true); 
  38.          */  
  39.         mBaiduMap = mMapView.getMap();    
  40.         mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);    
  41.           
  42.         //几何图形覆盖物  
  43.         //定义多边形的五个顶点    
  44.         LatLng pt1 = new LatLng(39.93923116.357428);    
  45.         LatLng pt2 = new LatLng(39.91923116.327428);    
  46.         LatLng pt3 = new LatLng(39.89923116.347428);    
  47.         LatLng pt4 = new LatLng(39.89923116.367428);    
  48.         LatLng pt5 = new LatLng(39.91923116.387428);    
  49.         List pts = new ArrayList();    
  50.         pts.add(pt1);    
  51.         pts.add(pt2);    
  52.         pts.add(pt3);    
  53.         pts.add(pt4);    
  54.         pts.add(pt5);    
  55.         //构建用户绘制多边形的Option对象    
  56.         OverlayOptions polygonOption = new PolygonOptions()    
  57.             .points(pts)    
  58.             .stroke(new Stroke(50xAA00FF00))    
  59.             .fillColor(0xAAFFFF00);    
  60.         //在地图上添加多边形Option,用于显示    
  61.         mBaiduMap.addOverlay(polygonOption);  
  62.           
  63.     }    
  64.     @Override    
  65.     protected void onDestroy() {    
  66.         super.onDestroy();    
  67.         //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理    
  68.         mMapView.onDestroy();    
  69.     }    
  70.     @Override    
  71.     protected void onResume() {    
  72.         super.onResume();    
  73.         //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理    
  74.         mMapView.onResume();    
  75.         }    
  76.     @Override    
  77.     protected void onPause() {    
  78.         super.onPause();    
  79.         //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理    
  80.         mMapView.onPause();    
  81.         }    
  82. }  

        运行该代码简单的测试结果如下所示:包括卫星地图、交通地图、普通地图和五边形覆盖物,其他覆盖物参考官方文档。

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第8张图片   (转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第9张图片   (转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第10张图片


三. 百度地图位置定位


        基础地图功能介绍参考:http://developer.baidu.com/map/index.php?title=androidsdk/guide/basicmap
        类方法介绍:http://wiki.lbsyun.baidu.com/cms/androidsdk/doc/v3_6_1/
        例如参考下图:MapStatusUpdateFactory方法

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第11张图片

        其中百度地图定位主要参考我以前的代码和crazy1235(推荐大家学习)的文章:
        [android] 百度地图开发 (三).定位当前位置及getLastKnownLocation总为空问题
        百度地图开发(二)之添加覆盖物 + 地理编码和反地理编码
        百度地图开发(三)之地图控制 + 定位 - crazy1235

        需要注意的地方和核心步骤包括:
        1.需要添加定位SDK包,在libs中添加locSDK_3.1.jar和liblocSDK3.so;
        2.在AndroidManifest.xml文件中设置service:
[html]  view plain  copy
  1. <application>  
  2.     <meta-data    
  3.         android:name="com.baidu.lbsapi.API_KEY"    
  4.         android:value="OYl0tcWvGrWtWucQN2rhdxG8" />  
  5.   
  6.     <activity>....activity>   
  7.       
  8.     <service   
  9.         android:name="com.baidu.location.f"   
  10.         android:enabled="true"   
  11.         android:process=":remote" >   
  12.     service>  
  13. application>  
        3.代码中通过BDLocationListener实现定位监听,具体代码如下:
[java]  view plain  copy
  1. package com.example.baidumapres;  
  2.   
  3. import com.baidu.location.BDLocation;  
  4. import com.baidu.location.BDLocationListener;  
  5. import com.baidu.location.LocationClient;  
  6. import com.baidu.location.LocationClientOption;  
  7. import com.baidu.mapapi.SDKInitializer;  
  8. import com.baidu.mapapi.map.BaiduMap;  
  9. import com.baidu.mapapi.map.BitmapDescriptor;  
  10. import com.baidu.mapapi.map.BitmapDescriptorFactory;  
  11. import com.baidu.mapapi.map.CircleOptions;  
  12. import com.baidu.mapapi.map.MapStatusUpdate;  
  13. import com.baidu.mapapi.map.MapStatusUpdateFactory;  
  14. import com.baidu.mapapi.map.MapView;  
  15. import com.baidu.mapapi.map.MarkerOptions;  
  16. import com.baidu.mapapi.map.MyLocationConfiguration;  
  17. import com.baidu.mapapi.map.MyLocationConfiguration.LocationMode;  
  18. import com.baidu.mapapi.map.MyLocationData;  
  19. import com.baidu.mapapi.map.OverlayOptions;  
  20. import com.baidu.mapapi.map.Stroke;  
  21. import com.baidu.mapapi.model.LatLng;  
  22. import android.app.Activity;  
  23. import android.os.Bundle;  
  24. import android.view.View;  
  25. import android.view.View.OnClickListener;  
  26. import android.widget.Button;  
  27. import android.widget.Toast;  
  28.   
  29. public class MainActivity extends Activity {  
  30.       
  31.     //百度地图控件  
  32.     private MapView mMapView = null;    
  33.     //百度地图对象  
  34.     private BaiduMap mBaiduMap;  
  35.     //按钮 添加覆盖物  
  36.     private Button addOverlayBtn;  
  37.     //是否显示覆盖物 1-显示 0-不显示  
  38.     private int isShowOverlay = 1;  
  39.     //按钮 定位当前位置  
  40.     private Button locCurplaceBtn;  
  41.     //是否首次定位  
  42.     private boolean isFirstLoc = true;  
  43.     //定位SDK的核心类  
  44.     private LocationClient mLocClient;  
  45.     //定位图层显示模式 (普通-跟随-罗盘)  
  46.     private LocationMode mCurrentMode;  
  47.     //定位图标描述  
  48.     private BitmapDescriptor mCurrentMarker = null;  
  49.     //当前位置经纬度  
  50.     private double latitude;  
  51.     private double longitude;  
  52.     //定位SDK监听函数  
  53.     public MyLocationListenner locListener = new MyLocationListenner();  
  54.       
  55.     @Override    
  56.     protected void onCreate(Bundle savedInstanceState) {    
  57.         super.onCreate(savedInstanceState);     
  58.         //在使用SDK各组件之前初始化context信息,传入ApplicationContext    
  59.         //注意该方法要再setContentView方法之前实现    
  60.         SDKInitializer.initialize(getApplicationContext());    
  61.         setContentView(R.layout.activity_main);    
  62.           
  63.         //获取地图控件    
  64.         mMapView = (MapView) findViewById(R.id.map_view);  
  65.         addOverlayBtn = (Button) findViewById(R.id.btn_add_overlay);  
  66.         locCurplaceBtn = (Button) findViewById(R.id.btn_cur_place);  
  67.         addOverlayBtn.setEnabled(false);  
  68.        
  69.         //设置地图缩放级别16 类型普通地图  
  70.         mBaiduMap = mMapView.getMap();    
  71.         MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(16.0f);    
  72.         mBaiduMap.setMapStatus(msu);  
  73.         mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);    
  74.           
  75.         //开启定位图层  
  76.         mBaiduMap.setMyLocationEnabled(true);  
  77.         //定位初始化  
  78.         //注意: 实例化定位服务 LocationClient类必须在主线程中声明 并注册定位监听接口  
  79.         mLocClient = new LocationClient(this);  
  80.         mLocClient.registerLocationListener(locListener);  
  81.         LocationClientOption option = new LocationClientOption();   
  82.         option.setOpenGps(true);              //打开GPS  
  83.         option.setCoorType("bd09ll");        //设置坐标类型  
  84.         option.setScanSpan(5000);            //设置发起定位请求的间隔时间为5000ms   
  85.         mLocClient.setLocOption(option);     //设置定位参数  
  86.         mLocClient.start();                  //调用此方法开始定位      
  87.           
  88.         //Button 添加覆盖物  
  89.         addOverlayBtn.setOnClickListener(new OnClickListener() {      
  90.             @Override      
  91.             public void onClick(View v) {  
  92.                 addCircleOverlay();  
  93.             }      
  94.         });    
  95.   
  96.         //Button 定位当前位置  
  97.         locCurplaceBtn.setOnClickListener(new OnClickListener() {      
  98.             @Override      
  99.             public void onClick(View v) {  
  100.                 addMyLocation();  
  101.             }      
  102.         });    
  103.           
  104.     }    
  105.       
  106.     /** 
  107.      * 定位SDK监听器 需添加locSDK jar和so文件 
  108.      */  
  109.     public class MyLocationListenner implements BDLocationListener {  
  110.   
  111.         @Override  
  112.         public void onReceivePoi(BDLocation location) {  
  113.         }  
  114.   
  115.         @Override  
  116.         public void onReceiveLocation(BDLocation location) {          
  117.             //mapview 销毁后不在处理新接收的位置  
  118.             if (location == null || mBaiduMap == null) {  
  119.                 return;  
  120.             }  
  121.             //MyLocationData.Builder定位数据建造器  
  122.             MyLocationData locData = new MyLocationData.Builder()  
  123.                     .accuracy(location.getRadius())  
  124.                     .direction(100)  
  125.                     .latitude(location.getLatitude())  
  126.                     .longitude(location.getLongitude())  
  127.                     .build();  
  128.             //设置定位数据  
  129.             mBaiduMap.setMyLocationData(locData);  
  130.             mCurrentMode = LocationMode.NORMAL;  
  131.             //获取经纬度  
  132.             latitude = location.getLatitude();  
  133.             longitude = location.getLongitude();  
  134.             //Toast.makeText(getApplicationContext(), String.valueOf(latitude), Toast.LENGTH_SHORT).show();  
  135.             //第一次定位的时候,那地图中心点显示为定位到的位置  
  136.             if (isFirstLoc) {  
  137.                 isFirstLoc = false;  
  138.                 //地理坐标基本数据结构  
  139.                 LatLng loc = new LatLng(location.getLatitude(),location.getLongitude());  
  140.                 //MapStatusUpdate描述地图将要发生的变化  
  141.                 //MapStatusUpdateFactory生成地图将要反生的变化  
  142.                 MapStatusUpdate msu = MapStatusUpdateFactory.newLatLng(loc);  
  143.                 mBaiduMap.animateMapStatus(msu);  
  144.                 Toast.makeText(getApplicationContext(), location.getAddrStr(),   
  145.                         Toast.LENGTH_SHORT).show();  
  146.             }  
  147.         }  
  148.     }  
  149.      
  150.     /** 
  151.      * 定位并添加标注 
  152.      */  
  153.     private void addMyLocation() {  
  154.              //更新  
  155.             mBaiduMap.setMyLocationConfigeration(new MyLocationConfiguration(  
  156.                     mCurrentMode, true, mCurrentMarker));     
  157.             mBaiduMap.clear();  
  158.             addOverlayBtn.setEnabled(true);  
  159.             //定义Maker坐标点    
  160.             LatLng point = new LatLng(latitude, longitude);    
  161.             //构建Marker图标    
  162.             BitmapDescriptor bitmap = BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);    
  163.             //构建MarkerOption,用于在地图上添加Marker    
  164.             OverlayOptions option = new MarkerOptions()    
  165.                 .position(point)    
  166.                 .icon(bitmap);    
  167.             //在地图上添加Marker,并显示    
  168.             mBaiduMap.addOverlay(option);  
  169.        }  
  170.       
  171.     /** 
  172.      * 添加覆盖物 
  173.      */  
  174.     private void addCircleOverlay() {  
  175.         if(isShowOverlay == 1) {  //点击显示  
  176.             mBaiduMap.clear();  
  177.             isShowOverlay = 0;  
  178.             //DotOptions 圆点覆盖物  
  179.             LatLng pt = new LatLng(latitude, longitude);   
  180.             CircleOptions circleOptions = new CircleOptions();  
  181.             //circleOptions.center(new LatLng(latitude, longitude));  
  182.             circleOptions.center(pt);                          //设置圆心坐标    
  183.             circleOptions.fillColor(0xAAFFFF00);               //圆填充颜色  
  184.             circleOptions.radius(250);                         //设置半径   
  185.             circleOptions.stroke(new Stroke(50xAA00FF00));   // 设置边框  
  186.             mBaiduMap.addOverlay(circleOptions);   
  187.         }   
  188.         else {  
  189.             mBaiduMap.clear();  
  190.             isShowOverlay = 1;  
  191.         }  
  192.     }  
  193.       
  194.     @Override    
  195.     protected void onDestroy() {    
  196.         mLocClient.stop();                       //退出时销毁定位  
  197.         mBaiduMap.setMyLocationEnabled(false);   //关闭定位图层  
  198.         mMapView.onDestroy();    
  199.         mMapView = null;  
  200.         super.onDestroy();    
  201.     }    
  202.       
  203.     @Override    
  204.     protected void onResume() {    
  205.         super.onResume();    
  206.         mMapView.onResume();    
  207.     }    
  208.       
  209.     @Override    
  210.     protected void onPause() {    
  211.         super.onPause();     
  212.         mMapView.onPause();    
  213.     }    
  214. }  
        运行结果如下图所示"我的位置"和"添加覆盖物":

(转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第12张图片        (转)Android百度地图之位置定位和附近查找代码简单实现 (上)_第13张图片

你可能感兴趣的:(Android进阶)