首先说一下注意事项:之前测试过百度的地图,现在要加一个餐饮店的详情页,没留意官网更新,就直接把以前下载的包拿来用,结果MKSearchListener里没有poiDetailSearch这个方法,然后去官网下载了个新包,加载上之后运行,点击查到的兴趣点的时候出错了,报的是空指针,又没提示在哪一行,各种验证之后无果,没办法,然后我把错误信息复制到度娘那里去找,居然只有一个人遇到这个问题,而且还没有解决,再后来下载一个新版本的demo,才知道原来是新版本里面有些方法和之前的写法不一样了,我把包换成原来的,运行正常!!,让我纳闷半天,以为不小心改动了什么地方呐,- -!
废话不多说了,下面这是目前最新的版本,正好新增功能就是我需要的那个
新增:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE"></uses-permission>
<uses-permission android:name="android.permission.CALL_PHONE"></uses-permission>
加包
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <com.baidu.mapapi.MapView android:id="@+id/loca_mapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /> </LinearLayout>
import java.util.ArrayList; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.location.LocationManager; import android.os.Bundle; import android.widget.Toast; import com.baidu.mapapi.BMapManager; import com.baidu.mapapi.GeoPoint; import com.baidu.mapapi.MKAddrInfo; import com.baidu.mapapi.MKBusLineResult; import com.baidu.mapapi.MKDrivingRouteResult; import com.baidu.mapapi.MKPoiInfo; import com.baidu.mapapi.MKPoiResult; import com.baidu.mapapi.MKSearch; import com.baidu.mapapi.MKSearchListener; import com.baidu.mapapi.MKSuggestionResult; import com.baidu.mapapi.MKTransitRouteResult; import com.baidu.mapapi.MKWalkingRouteResult; import com.baidu.mapapi.MapController; import com.baidu.mapapi.MapView; import com.baidu.mapapi.Overlay; import com.baidu.mapapi.PoiOverlay; public class LocaMapActivity extends com.baidu.mapapi.MapActivity { private BMapManager mapmanager = null; private LocationManager mlocmanager = null; private double mLat; private double mLon; private MapView mMapView = null; private MKSearch mkserach = null; private String name; private int juli; MKPoiResult mRes = null; // poi检索结果 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.locamap); init(); mkserach = new MKSearch(); mkserach.init(mapmanager, new MySearchListener());// 注意,MKSearchListener只支持一个,以最后一次设置为准 name = this.getIntent().getExtras().getString("name"); juli = Integer.parseInt(this.getIntent().getExtras().getString("juli")); // 查找周边商户(name和juli是用户选择的查询条件 name:餐饮,酒店,ATM之类的,juli是500,1000,2000) mkserach.poiSearchNearBy(name, new GeoPoint((int) (34.824349 * 1E6),(int) (113.688586 * 1E6)), juli); } @Override protected boolean isRouteDisplayed() { // TODO Auto-generated method stub return false; } private void init() { // 默认坐标 mLat = 34.824349; mLon = 113.688586; mapmanager = new BMapManager(LocaMapActivity.this); mapmanager.init("4B5C387B4901FB04FD45150A6628E95E6B2E68F0", null); mapmanager.start(); super.initMapActivity(mapmanager); mMapView = (MapView) findViewById(R.id.loca_mapView); mMapView.setBuiltInZoomControls(true); // 设置启用内置的缩放控件 MapController mMapController = mMapView.getController(); // 得到mMapView的控制权,可以用它控制和驱动平移和缩放 GeoPoint point = new GeoPoint((int) (mLat * 1E6), (int) (mLon * 1E6));//用默认的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6) mMapController.setCenter(point); // 设置地图中心点 mMapController.setZoom(16); // 设置地图zoom级别 mMapView.setTraffic(true);// 交通图 // mMapView.setSatellite(true);//卫星图 mMapView.getOverlays().add(new MyOverlay()); mMapView.getOverlays().add(new PoiOverlay(LocaMapActivity.this, mMapView, mkserach)); // 添加ItemizedOverlay实例到mMapView } /* * Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法,实现用户自定义图层显示。 * MyLocationOverlay:一个负责显示用户当前位置的Overlay。 *ItemizedOverlay<Item extends OverlayItem >:Overlay的一个基类,包含了一个OverlayItem列表,相当于一组分条的Overlay,通过继承此类,将一组兴趣点显示在地图上。 * PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如在北京市搜索“公园”,通过此图层将公园显示在地图上。 */ public class MyOverlay extends Overlay { @Override public void draw(Canvas canvas, MapView mapView, boolean shadow) { mLat = 34.824349; mLon = 113.688586; GeoPoint geoPoint = new GeoPoint((int) (mLat * 1E6), (int) (mLon * 1E6)); Paint paint = new Paint(); // 在当前的位置绘制一个String Point point = mMapView.getProjection().toPixels(geoPoint, null); canvas.drawText("★默认当前位置", point.x, point.y, paint); } } /** * @author Administrator 搜索服务 * 百度地图移动版API集成搜索服务包括:位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索, * 通过初始化MKSearch类,注册搜索结果的监听对象MKSearchListener,实现异步搜索服务。 * 首先自定义MySearchListener实现MKSearchListener接口,通过不同的回调方法,获得搜索结果: */ class MySearchListener implements MKSearchListener { @Override public void onGetWalkingRouteResult(MKWalkingRouteResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetTransitRouteResult(MKTransitRouteResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetPoiResult(MKPoiResult result, int arg1, int error) { if (result == null) { return; } mRes=result; PoiOverlay poioverlay = new PoiOverlay(LocaMapActivity.this, mMapView,mkserach); poioverlay.setData(result.getAllPoi()); mMapView.getOverlays().clear(); mMapView.getOverlays().add(poioverlay); mMapView.invalidate(); //刷新地图 mMapView.getController().animateTo(result.getPoi(0).pt); } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetAddrResult(MKAddrInfo arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetPoiDetailSearchResult(int arg0, int error) { // TODO Auto-generated method stub try { if (error!=0) { Toast.makeText(LocaMapActivity.this, "未找到商户详细信息", Toast.LENGTH_SHORT).show(); }else{ if (mRes != null) { ArrayList<MKPoiInfo> allPoi = mRes.getAllPoi(); if (allPoi.get(0).hasCaterDetails) { mkserach.poiDetailSearch(allPoi.get(0).uid); } } } } catch (Exception e) { // TODO: handle exception Toast.makeText(LocaMapActivity.this, e.toString(), 1000).show(); } } @Override public void onGetRGCShareUrlResult(String arg0, int arg1) { // TODO Auto-generated method stub } @Override public void onGetSuggestionResult(MKSuggestionResult result, int arg1) { // TODO Auto-generated method stub } } protected void onDestroy() { if (mapmanager != null) { mapmanager.destroy(); mapmanager = 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(); } }