Android百度地图API 之 定位周边搜索POI

来源:互联网 发布:xml json namespace 编辑:程序博客网 时间:2024/05/01 03:27



1)布局文件res/layout/main.xml
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.     android:layout_width="fill_parent"
  4.     android:layout_height="fill_parent"
  5.     android:orientation="vertical" >

  6.     <TextView
  7.         android:layout_width="fill_parent"
  8.         android:layout_height="wrap_content"
  9.         android:text="@string/hello" />
  10.    
  11.     <com.baidu.mapapi.MapView
  12.         android:id="@+id/map_View"
  13.         android:layout_width="fill_parent"
  14.         android:layout_height="fill_parent"
  15.         android:clickable="true" />
  16. </LinearLayout>
复制代码
布局文件基本上都这么个格式,这里可以加入一些其他的功能。
2)继承了com.baidu.mapapi.MapActivity的Activity类
  1. package com.search.map;

  2.     import android.location.Location;
  3.     import android.os.Bundle;
  4.     import com.baidu.mapapi.BMapManager;
  5.     import com.baidu.mapapi.GeoPoint;
  6.     import com.baidu.mapapi.LocationListener;
  7.     import com.baidu.mapapi.MKAddrInfo;
  8.     import com.baidu.mapapi.MKDrivingRouteResult;
  9.     import com.baidu.mapapi.MKPoiResult;
  10.     import com.baidu.mapapi.MKSearch;
  11.     import com.baidu.mapapi.MKSearchListener;
  12.     import com.baidu.mapapi.MKTransitRouteResult;
  13.     import com.baidu.mapapi.MKWalkingRouteResult;
  14.     import com.baidu.mapapi.MapActivity;
  15.     import com.baidu.mapapi.MapController;
  16.     import com.baidu.mapapi.MapView;
  17.     import com.baidu.mapapi.MyLocationOverlay;
  18.     import com.baidu.mapapi.PoiOverlay;

  19.     public class PoiSearchActivity extends MapActivity {
  20.             // 定义地图引擎管理类
  21.             private BMapManager mapManager;// 定义搜索服务类
  22.             private MKSearch mMKSearch;
  23.             private MapView mapView;
  24.             private MapController mapController;

  25.             LocationListener mLocationListener = null;// onResume时注册此listener,onPause时需要Remove
  26.             MyLocationOverlay mLocationOverlay = null; // 定位图层

  27.             @Override
  28.             public void onCreate(Bundle savedInstanceState) {
  29.                     super.onCreate(savedInstanceState);
  30.                     setContentView(R.layout.main);
  31.                     // 初始化MapActivity
  32.                     mapManager = new BMapManager(getApplication());

  33.                     // init方法的第一个参数需填入申请的APIKey
  34.                     mapManager.init("285B415EBAB2A92293E85502150ADA7F03C777C4", null);
  35.                     super.initMapActivity(mapManager);
  36.                     mapView = (MapView) findViewById(R.id.map_View);
  37.                     // 设置地图模式为交通地图
  38.                     mapView.setTraffic(true);
  39.                     // 设置启用内置的缩放控件
  40.                     mapView.setBuiltInZoomControls(true);
  41.                     // 设置在缩放动画过程中也显示overlay,默认为不绘制
  42.                     mapView.setDrawOverlayWhenZooming(true);

  43.                     // 添加定位图层
  44.                     mLocationOverlay = new MyLocationOverlay(this, mapView);
  45.                     mapView.getOverlays().add(mLocationOverlay);

  46.                     // 注册定位事件
  47.                     mLocationListener = new LocationListener() {

  48.                             @Override
  49.                             public void onLocationChanged(Location location) {
  50.                                     if (location != null) {
  51.                                             GeoPoint geoPoint = new GeoPoint((int) (location.getLatitude() * 1e6),
  52.                                                             (int) (location.getLongitude() * 1e6));
  53.                                             mapView.getController().animateTo(geoPoint);
  54.                                             mapController = mapView.getController();
  55.                                             // 设置地图的中心
  56.                                             mapController.setCenter(geoPoint);
  57.                                             // 设置地图默认的缩放级别
  58.                                             mapController.setZoom(16);
  59.                                             // 初始化
  60.                                             MKSearch mMKSearch = new MKSearch();
  61.                                             mMKSearch.init(mapManager, new MySearchListener());
  62.                                             // 搜索贵州大学校门口附近500米范围的自动取款机
  63.                                             mMKSearch.poiSearchNearBy("ATM", geoPoint, 500);
  64.                                     }
  65.                             }
  66.                     };

  67.             }

  68.             @Override
  69.             protected boolean isRouteDisplayed() {
  70.                     return false;
  71.             }

  72.             @Override
  73.             protected void onDestroy() {
  74.                     if (mapManager != null) {
  75.                             // 程序退出前需调用此方法
  76.                             mapManager.destroy();
  77.                             mapManager = null;
  78.                     }
  79.                     super.onDestroy();
  80.             }

  81.             @Override
  82.             protected void onPause() {
  83.                     if (mapManager != null) {
  84.                             // 终止百度地图API
  85.                             mapManager.getLocationManager().removeUpdates(mLocationListener);
  86.                             mLocationOverlay.disableMyLocation();
  87.                     mLocationOverlay.disableCompass(); // 关闭指南针
  88.                             mapManager.stop();
  89.                     }
  90.                     super.onPause();
  91.             }

  92.             @Override
  93.             protected void onResume() {
  94.                     if (mapManager != null) {
  95.                             // 开启百度地图API
  96.                             // 注册定位事件,定位后将地图移动到定位点
  97.                             mapManager.getLocationManager().requestLocationUpdates(mLocationListener);
  98.                             mLocationOverlay.enableMyLocation();
  99.                             mLocationOverlay.enableCompass(); // 打开指南针
  100.                             mapManager.start();
  101.                     }
  102.                     super.onResume();
  103.             }

  104.             /**
  105.              * * 实现MKSearchListener接口,用于实现异步搜索服务 * @author liufeng
  106.              */
  107.             public class MySearchListener implements MKSearchListener {
  108.                     /** * 根据经纬度搜索地址信息结果 * * @param result 搜索结果 * @param iError 错误号 (0表示正确返回) */
  109.                     @Override
  110.                     public void onGetAddrResult(MKAddrInfo result, int iError) {
  111.                     }

  112.                     /** * 驾车路线搜索结果 * * @param result 搜索结果 * @param iError 错误号 */
  113.                     @Override
  114.                     public void onGetDrivingRouteResult(MKDrivingRouteResult result, int iError) {
  115.                     }

  116.                     /**
  117.                      * * POI搜索结果(范围检索、城市POI检索、周边检索) * * @param result 搜索结果 * @param type
  118.                      * 返回结果类型(11,12,21:poi列表 7:城市列表) * @param iError 错误号(0表示正确返回)
  119.                      */
  120.                     @Override
  121.                     public void onGetPoiResult(MKPoiResult result, int type, int iError) {
  122.                             if (result == null) {
  123.                                     return;
  124.                             }
  125.                             // PoiOverlay是baidu map api提供的用于显示POI的Overlay
  126.                             PoiOverlay poioverlay = new PoiOverlay(PoiSearchActivity.this, mapView);
  127.                             // 设置搜索到的POI数据
  128.                             poioverlay.setData(result.getAllPoi());
  129.                             // 在地图上显示PoiOverlay(将搜索到的兴趣点标注在地图上)
  130.                             mapView.getOverlays().add(poioverlay);
  131.                     }

  132.                     /** * 公交换乘路线搜索结果 * * @param result 搜索结果 * @param iError 错误号(0表示正确返回) */
  133.                     @Override
  134.                     public void onGetTransitRouteResult(MKTransitRouteResult result, int iError) {
  135.                     }

  136.                     /** * 步行路线搜索结果 * * @param result 搜索结果 * @param iError 错误号(0表示正确返回) */
  137.                     @Override
  138.                     public void onGetWalkingRouteResult(MKWalkingRouteResult result, int iError) {
  139.                     }
  140.             }
  141.     }
复制代码
3)AndroidManifest.xml中的配置
  1. <?xml version="1.0" encoding="utf-8"?>
  2.     <manifest xmlns:android="http://schemas.android.com/apk/res/android"
  3.         package="com.search.map"
  4.         android:versionCode="1"
  5.         android:versionName="1.0" >

  6.         <uses-sdk android:minSdkVersion="8" />

  7.         <application
  8.             android:icon="@drawable/ic_launcher"
  9.             android:label="@string/app_name" >
  10.             <activity
  11.                 android:label="@string/app_name"
  12.                 android:name="PoiSearchActivity" >
  13.                 <intent-filter >
  14.                     <action android:name="android.intent.action.MAIN" />

  15.                     <category android:name="android.intent.category.LAUNCHER" />
  16.                 </intent-filter>
  17.             </activity>
  18.         </application>

  19.         <!-- 访问网络的权限 -->
  20.         <uses-permission android:name="android.permission.INTERNET" />
  21.         <!-- 访问精确位置的权限 -->
  22.         <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
  23.         <!-- 访问网络状态的权限 -->
  24.         <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  25.         <!-- 访问WIFI网络状态的权限 -->
  26.         <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  27.         <!-- 改变WIFI网络状态的权限 -->
  28.         <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
  29.         <!-- 读写存储卡的权限 -->
  30.         <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
  31.         <!-- 读取电话状态的权限 -->
  32.         <uses-permission android:name="android.permission.READ_PHONE_STATE" />

  33.     </manifest>
复制代码
在这个过程,要特别注意一点,模拟器是没有办法定位,当你加入定位模块的时候,传出的参数都是空的。
定位的这个方法函数,是通过回调接口来实现,而且触发该事件的时候,需要经纬度位置改变。

官方文档写得很清楚,简单点来说,就是你没有GPS定位设备就没有办法实现(只能真机测试),GPS定位是实时监控定位,随时都在接收和发射你的位置信息,只有不断的改变才能触发该定位事件。


转载:http://www.apkway.com/thread-6528-1-1.html

原创粉丝点击