百度地图_HelloWorld
百度地图常用的类: 1、 BMapManager 地图引擎管理类 重要方法: ①public boolean init(java.lang.String strKey, MKGeneralListener listener) strKey - 申请的授权验证码,listener - 注册回调事件(从服务器验证完毕后,调用listener中的方法) ②public boolean start() 开启百度地图API ③public boolean stop() 终止百度地图API,调用此函数后,不会再发生回调 ④public void destroy() 请在程序退出前调用 2、MKGeneralListener 一般事件通知接口。该接口返回网络状态,授权验证等结果,用户需要实现该接口以处理相应事件 重要方法: ① void onGe tNetworkState(int iError) 返回网络错误(可通过MKEvent来确定错误类别) ②void onGetPermissionState(int iError) 返回授权验认证状态码,0表示验证通过(可通过MKEvent来确定错误类别) 3、MKEvent 地图事件 ①ERROR_NETWORK_CONNECT 错误号:网络连接错误 ②ERROR_PERMISSION_DENIED 错误号:授权验证失败 4、MapView 显示地图的View。一个显示地图的视图,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图。 5、MapController 地图控制器 ①public float setZoom(float zoomLevel) 设置地图的缩放级别。 这个值的取值范围是[3,19]。 ②public void setCenter(GeoPoint point) 在给定的中心点GeoPoint上设置地图视图。 6、GeoPoint:表示一个地理坐标点,存放经度和纬度,以微度的整数形式存储 GeoPoint(int latitudeE6, int longitudeE6) //纬度,经度,用给定的经纬度构造一个GeoPoint,经度乘以一个10^6变成一个int值 |
步骤: 参照:http://developer.baidu.com/map/sdkandev-2.htm 1、获取百度地图的访问密钥 2、加载类库jar和.so文件 3、添加权限 4、在清单文件中声明HelloWorld,Activity 5、 通过 BMapManager 调用init()进行初始化工作 ,初始化完毕后有个回调的监听器 通过MKEvent的常量,来判断是否有网络以及是否验证成功 6、地图通过MapView 来展示到界面上 7、通过MapController来设置地图的缩放按钮,设置显示中心,缩放级别 ① BMapManager // NOTES===========================1、初始化BMapManager===========================
/**
* 初始化百度地图-BMapManager
*/
private void initBMapManager() {
// 注意:请在试用setContentView前初始化BMapManager对象,否则会报错
mBMapMan = new BMapManager(getApplication());
// 获取到百度的授权:Key发送到服务器端
mBMapMan.init(ConstantValue.KEY, new MKGeneralListener() {
// 返回授权验认证状态码
@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
Toast.makeText(getApplication(), "认证失败",Toast.LENGTH_SHORT).show();
}
}
// 返回网络错误
@Override
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(getApplication(), "无网络", Toast.LENGTH_SHORT).show();
}
}
});
} ②MapView // NOTES===========================2、设置MapController===========================
/**
* 2、MapController
*/
private void initMapView() {
mMapView = (MapView) this.findViewById(R.id.mapview);
// 1、地图上一个可以缩放和放大的按钮
mMapView.setBuiltInZoomControls(true);
//MapController用来控制MapView的移动,旋转,放大缩小,如果MapView不存在,它也就没有存在的必要
mapController = mMapView.getController();
// 2、设置地图的缩放级别
mapController.setZoom(12);// 3-19放大级别范围(2.0后),2.0以前(3-18),到了19级别,会有3D效果图,默认为3级别。
//3、设置地图的中心
int latitudeE6 = (int) (40.051 * 1E6);// 纬度,乘以10^6
int longitudeE6 = (int) (116.303 * 1E6);// 经度,乘以10^6
GeoPoint geoPoint = new GeoPoint(latitudeE6, longitudeE6);
mapController.setCenter(geoPoint);
// 地图中心处理(默认:天安门)
// TODO:4、MKMapViewListener监听器类
mapController.enableClick(true);// 当设置为true,MKMapViewListener里onClickMapPoi才能被触发
mMapView.regMapViewListener(mBMapMan, new MyMKMapViewListener());
} ③MapController @Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_zoom_in:
// 放大:放大一个级别
mapController.zoomIn();
break;
case R.id.bt_zoom_out:
// 缩放:缩放一个级别
mapController.zoomOut();
break;
case R.id.bt_move:
// 移动(带动画的),将地图中心点移动到"金燕龙办公楼"
mapController.animateTo(new GeoPoint(40065796, 116349868));
break;
case R.id.bt_rotate:
// 旋转
// setRotation()设置地图旋转角度 0~360°
// 1、获取到地图当前的(旋转)角度
// float nowRotation = mMapView.getRotation();
int mapRotation = mMapView.getMapRotation();
// 2、增加30度
mapRotation += 30;
// 3、设置给地图
mapController.setRotation(mapRotation);// 0~360°
// 4、转后的角度输出
Log.i(TAG, "旋转角度:" + mapRotation);
break;
case R.id.bt_overlooking:
// 俯角,默认为0°,
// 1、获取当前俯角度
int mapOverlooking = mMapView.getMapOverlooking();
// 2、更改角度值
mapOverlooking -= 5;
// 3、设置俯视角度
mapController.setOverlooking(mapOverlooking);// 设置地图俯视角度,范围:0~-45
Log.i(TAG, "俯视角度:" + mMapView.getMapOverlooking());
break;
} ④MKMapViewListener 1、为MapView注册MKMapViewListener mMapView.regMapViewListener(mBMapMan, new MyMKMapViewListener()); 2、并设置enableClick为true,否则onClickMapPoi方法无效,兴趣点poi点击无效 mapController.enableClick(true);// 当设置为true,MKMapViewListener里onClickMapPoi才能被触发 3、MKMapViewListener类 // NOTES===================5、MapView的监听器-MKMapViewListener===========
private class MyMKMapViewListener implements MKMapViewListener {
@Override
public void onMapMoveFinish() {
/**
* 在此处理地图移动完成回调
* 缩放,平移等操作完成后,此回调被触发
*/
Toast.makeText(getApplication(), "地图移动完毕", Toast.LENGTH_SHORT).show();
}
@Override
public void onMapLoadFinish() {
// 在此处理地图载完成事件
Toast.makeText(getApplication(), "地图加载完成", Toast.LENGTH_SHORT).show();
}
@Override
public void onMapAnimationFinish() {
// 地图完成带动画的操作(如: animationTo())后,此回调被触发
Toast.makeText(getApplication(), "动画完毕", Toast.LENGTH_SHORT).show();
}
@Override
public void onGetCurrentMap(Bitmap bitmap) {
/**
* 当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备
*/
Toast.makeText(getApplication(), "保存截图至存储设备", Toast.LENGTH_SHORT).show();
}
@Override
public void onClickMapPoi(MapPoi mapPoiInfo) {// poi兴趣点
/**
* 在此处理底图poi点击事件
* 显示底图poi名称并移动至该点
* 设置过: mMapController.enableClick(true); 时,此回调才能被触发
*
*/
if (mapPoiInfo!=null) {
// mapPoiInfo.geoPt;//兴趣点的经度纬度
String text = mapPoiInfo.strText;
Toast.makeText(getApplication(),text, Toast.LENGTH_SHORT).show();
// 然后移动到这里
mapController.animateTo(mapPoiInfo.geoPt);
}
}
}
|
HelloWorld核心代码: package cn.zengfansheng.mybaidumap.helloworld;
import android.app.Activity;
import android.graphics.Bitmap;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
import cn.zengfansheng.mybaidumap.ConstantValue;
import cn.zengfansheng.mybaidumap.R;
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MKMapViewListener;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapPoi;
import com.baidu.mapapi.map.MapView;
import com.baidu.platform.comapi.basestruct.GeoPoint; public class HelloWorld extends Activity implements OnClickListener {
private static final String TAG = "HelloWorld";
// 三大核心
// BMapManager
// MapView
// MapView 的MKMapViewListener
// MapController:地图的缩放、移动、旋转
private BMapManager mBMapMan;
private MapView mMapView;
private MapController mapController;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// 1、初始化BMapManager,通过调用init()方法,记得一定要在setContentView之前调用,否则会出错
initBMapManager();
// 2、设置显示地图的布局
setContentView(R.layout.helloworld);
// 3、设置MapView信息
initMapView();
// 4、初始化组件(要在setContentView之后)
initComponent();
}
// NOTES===================5、MapView的监听器-MKMapViewListener===========
private class MyMKMapViewListener implements MKMapViewListener {
@Override
public void onMapMoveFinish() {
/**
* 在此处理地图移动完成回调
* 缩放,平移等操作完成后,此回调被触发
*/
Toast.makeText(getApplication(), "地图移动完毕", Toast.LENGTH_SHORT).show();
}
@Override
public void onMapLoadFinish() {
// 在此处理地图载完成事件
Toast.makeText(getApplication(), "地图加载完成", Toast.LENGTH_SHORT).show();
}
@Override
public void onMapAnimationFinish() {
// 地图完成带动画的操作(如: animationTo())后,此回调被触发
Toast.makeText(getApplication(), "动画完毕", Toast.LENGTH_SHORT).show();
}
@Override
public void onGetCurrentMap(Bitmap bitmap) {
/**
* 当调用过 mMapView.getCurrentMap()后,此回调会被触发 可在此保存截图至存储设备
*/
Toast.makeText(getApplication(), "保存截图至存储设备", Toast.LENGTH_SHORT).show();
}
@Override
public void onClickMapPoi(MapPoi mapPoiInfo) {// poi兴趣点
/**
* 在此处理底图poi点击事件
* 显示底图poi名称并移动至该点
* 设置过: mMapController.enableClick(true); 时,此回调才能被触发
*
*/
if (mapPoiInfo!=null) {
// mapPoiInfo.geoPt;//兴趣点的经度纬度
String text = mapPoiInfo.strText;
Toast.makeText(getApplication(),text, Toast.LENGTH_SHORT).show();
// 然后移动到这里
mapController.animateTo(mapPoiInfo.geoPt);
}
}
} // NOTES===========================4、控制地图的移动===========================
private Button btnZoomIn;// 放大
private Button btnZoomOut;// 缩放
private Button btnMove;// 移动
private Button btnRotate;// 旋转
private Button btnOverlooking;// 俯视
/**
* 初始化组件和设置监听
*/
private void initComponent() {
btnZoomIn = (Button) this.findViewById(R.id.bt_zoom_in);
btnZoomOut = (Button) this.findViewById(R.id.bt_zoom_out);
btnMove = (Button) this.findViewById(R.id.bt_move);
btnRotate = (Button) this.findViewById(R.id.bt_rotate);
btnOverlooking = (Button) this.findViewById(R.id.bt_overlooking); btnZoomIn.setOnClickListener(this);
btnZoomOut.setOnClickListener(this);
btnMove.setOnClickListener(this);
btnRotate.setOnClickListener(this);
btnOverlooking.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_zoom_in:
// 放大:放大一个级别
mapController.zoomIn();
break;
case R.id.bt_zoom_out:
// 缩放:缩放一个级别
mapController.zoomOut();
break;
case R.id.bt_move:
// 移动(带动画的),将地图中心点移动到"金燕龙办公楼"
mapController.animateTo(new GeoPoint(40065796, 116349868));
break;
case R.id.bt_rotate:
// 旋转
// setRotation()设置地图旋转角度 0~360°
// 1、获取到地图当前的(旋转)角度
// float nowRotation = mMapView.getRotation();
int mapRotation = mMapView.getMapRotation();
// 2、增加30度
mapRotation += 30;
// 3、设置给地图
mapController.setRotation(mapRotation);// 0~360°
// 4、转后的角度输出
Log.i(TAG, "旋转角度:" + mapRotation);
break;
case R.id.bt_overlooking:
// 俯角,默认为0°,
// 1、获取当前俯角度
int mapOverlooking = mMapView.getMapOverlooking();
// 2、更改角度值
mapOverlooking -= 5;
// 3、设置俯视角度
mapController.setOverlooking(mapOverlooking);// 设置地图俯视角度,范围:0~-45
Log.i(TAG, "俯视角度:" + mMapView.getMapOverlooking());
break;
}
} // NOTES===========================3、MapView的生命周期,类似Activity的===========================
@Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.destroy();
} // NOTES===========================2、设置MapController===========================
/**
* 2、MapController
*/
private void initMapView() {
mMapView = (MapView) this.findViewById(R.id.mapview);
// 1、地图上一个可以缩放和放大的按钮
mMapView.setBuiltInZoomControls(true); //MapController用来控制MapView的移动,旋转,放大缩小,如果MapView不存在,它也就没有存在的必要
mapController = mMapView.getController(); // 2、设置地图的缩放级别
mapController.setZoom(12);// 3-19放大级别范围(2.0后),2.0以前(3-18),到了19级别,会有3D效果图,默认为3级别。 //3、设置地图的中心
int latitudeE6 = (int) (40.051 * 1E6);// 纬度,乘以10^6
int longitudeE6 = (int) (116.303 * 1E6);// 经度,乘以10^6
GeoPoint geoPoint = new GeoPoint(latitudeE6, longitudeE6);
mapController.setCenter(geoPoint);
// 地图中心处理(默认:天安门) // TODO:4、MKMapViewListener监听器类
mapController.enableClick(true);// 当设置为true,MKMapViewListener里onClickMapPoi才能被触发
mMapView.regMapViewListener(mBMapMan, new MyMKMapViewListener());
}
// NOTES===========================1、初始化BMapManager===========================
/**
* 初始化百度地图-BMapManager
*/
private void initBMapManager() { // 注意:请在试用setContentView前初始化BMapManager对象,否则会报错
mBMapMan = new BMapManager(getApplication()); // 获取到百度的授权:Key发送到服务器端
mBMapMan.init(ConstantValue.KEY, new MKGeneralListener() {
// 返回授权验认证状态码
@Override
public void onGetPermissionState(int iError) {
if (iError == MKEvent.ERROR_PERMISSION_DENIED) {
Toast.makeText(getApplication(), "认证失败",Toast.LENGTH_SHORT).show();
}
}
// 返回网络错误
@Override
public void onGetNetworkState(int iError) {
if (iError == MKEvent.ERROR_NETWORK_CONNECT) {
Toast.makeText(getApplication(), "无网络", Toast.LENGTH_SHORT).show();
}
}
});
}
} |
结果: |
问题:在进入地图后,按后退键,然后在重新进来,会出现白板 解决:MapView的生命周期 @Override
protected void onResume() {
super.onResume();
mMapView.onResume();
}
@Override
protected void onPause() {
super.onPause();
mMapView.onPause();
}
@Override
protected void onDestroy() {
super.onDestroy();
mMapView.destroy();
}
|