开发指南:
申请KEY:
http://dev.baidu.com/wiki/static/imap/key/
API,文档和例子下载:
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);
}
}