`
JustOneCoder
  • 浏览: 59486 次
  • 性别: Icon_minigender_1
文章分类
社区版块
存档分类
最新评论

Android 应用集成百度地图开发和注意事项

 
阅读更多

首先说一下注意事项:之前测试过百度的地图,现在要加一个餐饮店的详情页,没留意官网更新,就直接把以前下载的包拿来用,结果MKSearchListener里没有poiDetailSearch这个方法,然后去官网下载了个新包,加载上之后运行,点击查到的兴趣点的时候出错了,报的是空指针,又没提示在哪一行,各种验证之后无果,没办法,然后我把错误信息复制到度娘那里去找,居然只有一个人遇到这个问题,而且还没有解决,再后来下载一个新版本的demo,才知道原来是新版本里面有些方法和之前的写法不一样了,我把包换成原来的,运行正常!!,让我纳闷半天,以为不小心改动了什么地方呐,- -!

废话不多说了,下面这是目前最新的版本,正好新增功能就是我需要的那个


2012年12月3日 Android SDK: V1.3.5

新增:

  • 开放餐饮类Place详情页
  • 支持LBS云检索,实现用户数据地图展现,新增云检索类

然后就是实现全过程了:

首先是准备工作:
加权限
    <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>
加包
在项目Libraries里添加baidumapapi.jar,将libBMapApiEngine_v1_3_5.so复制到工程目录下的libs\armeabi

布局文件main.xml

<?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();
	}
}




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics