[baidu] 01_百度地图_HelloWorld

Android 4.0

百度地图_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.KEYnew 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(mBMapMannew 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(mBMapMannew 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(mBMapMannew MyMKMapViewListener());
    }
    // NOTES===========================1、初始化BMapManager===========================
    /**
     * 初始化百度地图-BMapManager
     */
    private void initBMapManager() {

        // 注意:请在试用setContentView前初始化BMapManager对象,否则会报错
        mBMapMan = new BMapManager(getApplication());

        // 获取到百度的授权:Key发送到服务器端
        mBMapMan.init(ConstantValue.KEYnew 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();
}