开发指南:
http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97
申请KEY:
http://dev.baidu.com/wiki/static/imap/key/
API,文档和例子下载:
http://dev.baidu.com/wiki/imap/index.php?title=Android%E5%B9%B3%E5%8F%B0/%E7%9B%B8%E5%85%B3%E4%B8%8B%E8%BD%BD
目前采用的定位方式有:
GPS定位:与您手机的硬件条件相关,一般在户外时才能生效。定位精度一般在5-10米,不需要通过网络。可以在手机系统的设置中打开或者关闭。
基站定位:和手机信号及网络状况相关,定位精度与GPS相比较差,但在一般的室内仍可生效。
Wi-Fi定位:和手机所处的Wi-Fi网络相关,定位精度与GPS相比较差,大多在室内生效。
不能定位问题:
发现没装SIM卡或是废卡时,定位经常会出现不能定位的问题,onLocationChanged不会回调。
正确的方式需要SIM卡,并且需要网络(wifi | GPRS GPRS偏差较大),而设置-位置里的选项并没有效果,勾不勾都无所谓,可能baidu底层处理了?
接口调用:
接口需要在UI主线程里调用,因为需要用到消息循环,当然你可以在你调用的线程里创建已个消息循环。
GeoPoint为什么是以微度的整数形式存储:
GeoPoint(int latitudeE6, int longitudeE6)
用整形存储,加快运行速度 int的运算要比浮点快很多。
下面的代码是简单的实现了定位和POI的多关键字搜索:需要在UI线程里调用相关方法。
public class BaiduMapManager { /** Baidu map开关 */ public static final boolean isAddBaiduMap = true; /** 申请的Key */ public static final String KEY = "26E61E1DF0E776336AF17E9BF1FC9979EA713CCE"; private static BMapManager bMapManager; private static LocationListener mLocationListener; /** 搜索模块,也可去掉地图模块独立使用 */ private static MKSearch mSearch; private static boolean hasGetLocation; private static Location lastLocation; private static void debug(String msg) { DebugManager.Log_debug("Baidu", msg); } public static void init() { if (!isAddBaiduMap) { return; } bMapManager = new BMapManager(AppConfig.getContext()); bMapManager.init(KEY, new MKGeneralListener() { /** * 返回网络错误 */ @Override public void onGetPermissionState(int iError) { debug("ERROR id:" + iError); } /** * 返回授权验证错误 * 300 = 验证失败 */ @Override public void onGetNetworkState(int iError) { debug("ERROR id:" + iError); } }); // 设置回调结果容量 MKSearch.setPoiPageCapacity(10); // 初始化搜索模块,注册事件监听 mSearch = new MKSearch(); mSearch.init(bMapManager, new MKSearchListener(){ @Override public void onGetPoiResult(MKPoiResult res, int type, int error) { // 错误号可参考MKEvent中的定义 if (error != 0 || res == null) { GameConfig.showToast("抱歉,未找到结果"); return; } ArrayList<MKPoiResult> result = res.getMultiPoiResult(); if (result == null) { GameConfig.showToast("抱歉,未找到结果"); return; } GameConfig.showToast("成功找到" + result.size() + "条结果!"); // 用完了马上关上,否则手机一直处于定位状态!!! stop(); } @Override public void onGetDrivingRouteResult(MKDrivingRouteResult res, int error) { } @Override public void onGetTransitRouteResult(MKTransitRouteResult res, int error) { } @Override public void onGetWalkingRouteResult(MKWalkingRouteResult res, int error) { } @Override public void onGetAddrResult(MKAddrInfo res, int error) { } }); // 注册定位事件 mLocationListener = new LocationListener(){ @Override public void onLocationChanged(Location location) { lastLocation = location; seachPOI(lastLocation); } }; } private static void seachPOI(Location location) { if(location == null) { GameConfig.showToast("抱歉,未找到结果"); return; } if(!hasGetLocation) { hasGetLocation = true; String strLog = String.format("您当前的位置:\r\n" + "纬度:%f\r\n" + "经度:%f", location.getLatitude(), location.getLongitude()); debug(strLog); // 关键词(1.10] String[] keys = new String[] { "公园", "KTV", "电影院", "景点", "餐馆", "麦当劳", "肯德基", "必胜客", "饭店", "医院" }; // 用整形存储,加快运行速度 int的运算要比浮点快很多 GeoPoint gp = new GeoPoint( (int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6)); mSearch.poiMultiSearchNearBy(keys, gp, 5000); } } /** * 请在程序推出前调用 */ public static void destroy() { if (!isAddBaiduMap) { return; } if (bMapManager != null) { bMapManager.destroy(); bMapManager = null; } } /** * 开启百度地图API */ public static void start() { if (!isAddBaiduMap) { return; } hasGetLocation = false; ProgressDialog pd = GameConfig.getProgressDialog(); pd.setTitle("正在获取地理位置信息!"); pd.setIcon(0); pd.setMessage(AppConfig.getResources().getString(R.string.wait)); pd.setCancelable(true); GameConfig.sendMessage(GameConfig.MSG_PROGRESSDIALOG_SHOW); if (bMapManager != null) { // 注册Listener bMapManager.getLocationManager().requestLocationUpdates(mLocationListener); bMapManager.start(); lastLocation = bMapManager.getLocationManager().getLocationInfo(); if(lastLocation != null) { seachPOI(lastLocation); } } } /** * 终止百度地图API,调用此函数后,不会发生回调 */ public static void stop() { if (!isAddBaiduMap) { return; } if (bMapManager != null) { // 移除listener bMapManager.getLocationManager().removeUpdates(mLocationListener); bMapManager.stop(); } GameConfig.sendMessage(GameConfig.MSG_PROGRESSDIALOG_HIDE); } }