1、版本和key的对应
相关包和权限的设定以及相关配置的引入
2、定位、加载已知定位、搜索
package com.DDMap.ddmap;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RadioButton;
import android.widget.Toast;
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.map.PoiOverlay;
import com.baidu.mapapi.map.TransitOverlay;
import com.baidu.mapapi.search.MKAddrInfo;
import com.baidu.mapapi.search.MKBusLineResult;
import com.baidu.mapapi.search.MKDrivingRouteResult;
import com.baidu.mapapi.search.MKPoiInfo;
import com.baidu.mapapi.search.MKPoiResult;
import com.baidu.mapapi.search.MKSearch;
import com.baidu.mapapi.search.MKSearchListener;
import com.baidu.mapapi.search.MKSuggestionResult;
import com.baidu.mapapi.search.MKTransitRouteResult;
import com.baidu.mapapi.search.MKWalkingRouteResult;
import com.baidu.platform.comapi.basestruct.GeoPoint;
public class MainActivity extends Activity implements OnClickListener {
protected static final String TAG = "MainActivity";
private static boolean isWeiXing = false;
private static boolean isSimple = true;
private static LocationData locationData = new LocationData();
private boolean flag_new = true;
private MapView mMapView;
private BMapManager mBMapMan;// 加载引擎
private EditText et_search;
private ImageView btn_search;
private RadioButton radio_btn_changemode;// 改变模式的radio_btn_changemode
private RadioButton radio_btn_refresh;// 更新位置的radio_btn_refresh
private String key = "60BC0E114DF04490271E1FD3974546C4CDAD4CC3";
// private String key = "wb1oFj9uMZBbKdQTu1P8HGEa";
public LocationClient mLocationClient = null;
public BDLocationListener myListener = new MyLocationListener();
private MapController mMapController;
private MKSearch mkSearch;
private String content;// 用户输入的要查询的内容
private GeoPoint pt1; // 当前坐标点
private double mLat1 = 39.915; // point1纬度
private double mLon1 = 116.404; // point1经度
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
mBMapMan = new BMapManager(getApplication());
mBMapMan.init(key, null);
// 注意:请在试用setContentView前初始化BMapManager对象,否则会报错
setContentView(R.layout.activity_main);
mMapView = (MapView) findViewById(R.id.bmapView);
mMapView.setBuiltInZoomControls(true);
// mMapView.setDrawOverlayWhenZooming(true);
mMapController = mMapView.getController();
// 得到mMapView的控制权,可以用它控制和驱动平移和缩放
GeoPoint point = new GeoPoint((int) (39.915 * 1E6),
(int) (116.404 * 1E6));
// 用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)
mMapController.setCenter(point);// 设置地图中心点
mMapController.setZoom(12);// 设置地图zoom级别
initView();
initlocation();
mLocationClient = new LocationClient(getApplicationContext()); // 声明LocationClient类
mLocationClient.registerLocationListener(myListener); // 注册监听函数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true);
option.setAddrType("all");// 返回的定位结果包含地址信息
option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
option.setScanSpan(5000);// 设置发起定位请求的间隔时间为5000ms
option.disableCache(true);// 禁止启用缓存定位
option.setPoiNumber(5); // 最多返回POI个数
option.setPoiDistance(1000); // poi查询距离
option.setPoiExtraInfo(true); // 是否需要POI的电话和地址等详细信息
// 发起定位请求
mLocationClient.setLocOption(option);
mLocationClient.start();
mkSearch = new MKSearch();
mkSearch.init(mBMapMan, new MKSearchListener() {
@Override
public void onGetWalkingRouteResult(MKWalkingRouteResult res,
int error) {
}
@Override
public void onGetTransitRouteResult(MKTransitRouteResult res,
int error) {
if (error != 0 || res == null) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果",
Toast.LENGTH_SHORT).show();
return;
}
TransitOverlay routeOverlay = new TransitOverlay(
MainActivity.this, mMapView);
// 此处仅展示一个方案作为示例
routeOverlay.setData(res.getPlan(0));
mMapView.getOverlays().clear();
mMapView.getOverlays().add(routeOverlay);
mMapView.refresh();
// 使用zoomToSpan()绽放地图,使路线能完全显示在地图上
mMapView.getController().zoomToSpan(
routeOverlay.getLatSpanE6(),
routeOverlay.getLonSpanE6());
mMapView.getController().animateTo(res.getStart().pt);
}
@Override
public void onGetSuggestionResult(MKSuggestionResult arg0, int arg1) {
}
@Override
public void onGetPoiResult(MKPoiResult res, int type, int error) {
if (error == MKEvent.ERROR_RESULT_NOT_FOUND) {
Toast.makeText(MainActivity.this, "抱歉,未找到结果",
Toast.LENGTH_LONG).show();
return;
} else if (error != 0 || res == null) {
Toast.makeText(MainActivity.this, "搜索出错啦..",
Toast.LENGTH_LONG).show();
return;
}
// 将poi结果显示到地图上
PoiOverlay poiOverlay = new PoiOverlay(MainActivity.this,
mMapView);
poiOverlay.setData(res.getAllPoi());
mMapView.getOverlays().clear();
mMapView.getOverlays().add(poiOverlay);
mMapView.refresh();
// 当ePoiType为2(公交线路)或4(地铁线路)时, poi坐标为空
for (MKPoiInfo info : res.getAllPoi()) {
if (info.pt != null) {
mMapView.getController().animateTo(info.pt);
break;
}
}
}
@Override
public void onGetPoiDetailSearchResult(int arg0, int arg1) {
}
@Override
public void onGetDrivingRouteResult(MKDrivingRouteResult arg0,
int arg1) {
}
@Override
public void onGetBusDetailResult(MKBusLineResult arg0, int arg1) {
}
@Override
public void onGetAddrResult(MKAddrInfo arg0, int arg1) {
}
});
}
// 初始化控件
private void initView() {
btn_search = (ImageView) findViewById(R.id.btn_search);
btn_search.setOnClickListener(this);
et_search = (EditText) findViewById(R.id.et_search);
content = et_search.getText().toString();
radio_btn_changemode = (RadioButton) findViewById(R.id.radio_btn_changemode);
radio_btn_refresh = (RadioButton) findViewById(R.id.radio_btn_refresh);
radio_btn_changemode.setOnClickListener(this);
radio_btn_refresh.setOnClickListener(this);
}
@Override
public void onClick(View v) {
// mMapView.setSatellite(true);//设置卫星地图
// mMapView.setTraffic(true); 设置普通地图
switch (v.getId()) {
case R.id.radio_btn_changemode: // 改变模式的点击事件
if (isWeiXing) {
isWeiXing = false;
isSimple = true;
mMapView.setSatellite(isWeiXing);
mMapView.setTraffic(isSimple);
} else if (isSimple) {
isSimple = false;
isWeiXing = true;
mMapView.setSatellite(isWeiXing);
mMapView.setTraffic(isSimple);
}
break;
case R.id.radio_btn_refresh: // 更新位置的点击事件
flag_new = true;
break;
case R.id.btn_search: // 搜索附近的点击事件
btn_search.setBackgroundColor(Color.GREEN);
content = et_search.getText().toString();
mkSearch.poiSearchNearBy(content, pt1, 10000);// 附近10000米进行搜索
break;
}
}
@Override
protected void onDestroy() {
mMapView.destroy();
if (mBMapMan != null) {
mBMapMan.destroy();
mBMapMan = null;
}
super.onDestroy();
}
@Override
protected void onPause() {
mMapView.onPause();
if (mBMapMan != null) {
mBMapMan.stop();
}
super.onPause();
}
@Override
protected void onResume() {
mMapView.onResume();
if (mBMapMan != null) {
mBMapMan.start();
}
super.onResume();
}
private class MyLocationListener implements BDLocationListener {
// 大概一秒钟定位一次
@Override
public void onReceiveLocation(BDLocation location) {
if (location == null)
return;
if (flag_new == true) {
Toast.makeText(MainActivity.this,
"我的定位" + location.getAddrStr(), Toast.LENGTH_SHORT)
.show();
pt1 = new GeoPoint((int) (location.getLatitude() * 1E6),
(int) (location.getLongitude() * 1E6));
locationData.latitude = location.getLatitude();
locationData.longitude = location.getLongitude();
locationData.direction = 2.0f;
locationData.accuracy = location.getRadius();// 获取服务
locationData.direction = location.getDerect();
// myLocationOverlay.setData(locationData);//异步加载locationData,必须异步加载,否则myLocationOverlay不会显示
mMapView.refresh();// 此处刷新必须有
// 定位本地位置,此句没有,则无法定位
mMapController.animateTo(new GeoPoint(
(int) (locationData.latitude * 1e6),
(int) (locationData.longitude * 1e6)));
MyLocationOverlay myLocationOverlay = new MyLocationOverlay(
mMapView);
// LocationData locData = new LocationData();
// 手动将位置源置为天安门,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要
// 使用百度经纬度坐标(bd09ll)
// locData.latitude = location.getLatitude();
// locData.longitude = location.getLongitude();
locationData.direction = 2.0f;
myLocationOverlay.setData(locationData);
mMapView.getOverlays().add(myLocationOverlay);
mMapView.refresh();
flag_new = false;
}
}
@Override
public void onReceivePoi(BDLocation poiLocation) {
if (poiLocation == null) {
Toast.makeText(getApplicationContext(), "null", 1).show();
return;
}
Toast.makeText(getApplicationContext(), "111111", 1).show();
Log.i("onReceivePoi", "______________________");
// 初始化mkSearch
}
}
private void initlocation() {
mMapController.animateTo(new GeoPoint((int) (mLat1 * 1e6),
(int) (mLon1 * 1e6)));
MyLocationOverlay myLocationOverlay = new MyLocationOverlay(mMapView);
LocationData locData = new LocationData();
// 手动将位置源置为天安门,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要
// 使用百度经纬度坐标(bd09ll)
locData.latitude = mLat1;
locData.longitude = mLon1;
myLocationOverlay.setData(locData);
mMapView.getOverlays().add(myLocationOverlay);
mMapView.refresh();
}
public static LocationData getLocationDate() {
return locationData;
}
}