android 百度地图

android

2013-12-30 08:46

百度地图

http://developer.baidu.com/map/sdk-android.htm


获取key

http://lbsyun.baidu.com/apiconsole/key


签名

http://hi.baidu.com/code__/item/5b9074187a39ff5ef1090e96


安全码的组成规则为:Android签名证书的sha1值+";"+packagename(即:数字签名+分号+包名)

获取Android签名证书的sha1值

keytool -list -v -keystore keystorefile -storepass 123456



 第一步:在工程里新建libs文件夹,将开发包里的baidumapapi_vX_X_X.jar拷贝到libs根目录下,将libBaiduMapSDK_vX_X_X.so拷贝到libs\armeabi目录下(官网demo里已有这两个文件,如果要集成到自己的工程里,就需要自己添加)

 第二步:在工程属性->Java Build Path->Libraries中选择“Add External JARs”,选定baidumapapi_vX_X_X.jar,确定后返回。

    通过以上两步操作后,您就可以正常使用百度地图SDK为您提供的全部功能了。

3.显示地图

    百度地图SDK为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据:

    第一步:创建并配置工程(具体方法参见工程配置部分的介绍);

    第二步:在Manifest中添加使用权限及Android版本支持;

    常用使用权限如下(开发者可根据自身程序需求,添加所需权限):


<!--使用网络功能所需权限  -->  

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE">  

</uses-permission>  

<uses-permission android:name="android.permission.INTERNET">  

</uses-permission>  

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE">  

</uses-permission>  

<uses-permission android:name="android.permission.CHANGE_WIFI_STATE">  

</uses-permission>  

<!-- SDK离线地图和cache功能需要读写外部存储器 -->  

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE">  

</uses-permission>  

<uses-permission android:name="android.permission.WRITE_SETTINGS">  

</uses-permission>  

<!-- 获取设置信息和详情页直接拨打电话需要以下权限  -->  

<uses-permission android:name="android.permission.READ_PHONE_STATE">  

</uses-permission>  

<uses-permission android:name="android.permission.CALL_PHONE">  

</uses-permission>  

<!-- 使用定位功能所需权限,demo已集成百度定位SDK,不使用定位功能可去掉以下6项 -->  

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION">  

</uses-permission>  

<permission android:name="android.permission.BAIDU_LOCATION_SERVICE">  

</permission>  

<uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE">  

</uses-permission>  

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION">  

</uses-permission>  

<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION">  

</uses-permission>  

<uses-permission android:name="android.permission.ACCESS_GPS"/>                    

    配置Activity:

<activity android:name=".MapDemo"  

          android:screenOrientation="sensor"  

          android:configChanges="orientation|keyboardHidden">  

</activity>  

    添加屏幕及版本支持:


<supports-screens android:largeScreens="true"  

            android:normalScreens="true"  

            android:smallScreens="true"  

            android:resizeable="true"  

            android:anyDensity="true"/>  

<uses-sdk android:minSdkVersion="7"></uses-sdk>  


    第三步:在布局xml文件中添加地图控件,布局文件保存为activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>  

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  

            android:orientation="vertical"  

            android:layout_width="fill_parent"  

            android:layout_height="fill_parent">  

            <TextView android:layout_width="fill_parent"  

                    android:layout_height="wrap_content"  

                    android:text="hello world" />  

            <com.baidu.mapapi.map.MapView android:id="@+id/bmapsView"  

                    android:layout_width="fill_parent"  

                    android:layout_height="fill_parent"  

                    android:clickable="true" />  

</LinearLayout>  


    第四步:创建地图Activity,并import相关类:

import android.app.Activity;  

import android.content.res.Configuration;  

import android.os.Bundle;  

import android.view.Menu;  

import android.widget.FrameLayout;  

import android.widget.Toast;  

import com.baidu.mapapi.BMapManager;  

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 MyMapActivity extends Activity{  

        @Override  

        public void onCreate(Bundle savedInstanceState){  

        }  

}   


    第五步:初始化地图Activity、使用Key:

    在MyMapActivity中定义成员变量:


BMapManager mBMapMan = null;  

MapView mMapView = null;  


    在onCreate方法中增加以下代码,并将您申请的Key替换“我的Key”


super.onCreate(savedInstanceState);  

mBMapMan=new BMapManager(getApplication());  

mBMapMan.init("我的Key"null);    

//注意:请在试用setContentView前初始化BMapManager对象,否则会报错  

setContentView(R.layout.activity_main);  

mMapView=(MapView)findViewById(R.id.bmapsView);  

mMapView.setBuiltInZoomControls(true);  

//设置启用内置的缩放控件  

MapController 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级别  

    重写以下方法,管理API


@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();  

}  


-------------------------地图连接监听--------------------------------------------------

mBMapMan.init("我的key", new MKGeneralListener() {

    @Override

    public void onGetPermissionState(int iError) {

        // TODO 返回授权验证错误,通过错误代码判断原因,MKEvent中常量值。

         // 0:  认证通过, 非零值表表示认证失败。 

         // -300: 无法建立与服务端的连接。

         // -200: 服务端数据错误,无法解析验证服务器返回数据。

         // 其他返回请参考: http://developer.baidu.com/map/lbs-appendix.htm


    }

    @Override

    public void onGetNetworkState(int iError) {

        // TODO 返回网络错误,通过错误代码判断原因,MKEvent中常量值。

    }

});

----------------------地图事件监听------------------------------------------------

MKMapViewListener mapViewListener = new MKMapViewListener() {  


    @Override  

    public void onMapMoveFinish() {  

        // 此处可以实现地图移动完成事件的状态监听  

    }  

                         

    @Override  

    public void onClickMapPoi(MapPoi arg0) {  

        // 此处可实现点击到地图可点标注时的监听  

    }  


    @Override

    public void onGetCurrentMap(Bitmap b) {

        //用MapView.getCurrentMap()发起截图后,在此处理截图结果.  

    }


    @Override

    public void onMapAnimationFinish() {

    /**

     *  地图完成带动画的操作(如: animationTo())后,此回调被触发

     */

    }


    @Override

    public void onMapLoadFinish() {

        //地图初始化完成时,此回调被触发. 

    }     

};  

mMapView.regMapViewListener(mBMapMan, mapViewListener);  //注册监听

------------------------------地图点击事件监听------------------------------------------------

MKMapTouchListener mapTouchListener = new MKMapTouchListener(){

        @Override

        public void onMapClick(GeoPoint point) {

            //在此处理地图单击事件

        }


        @Override

        public void onMapDoubleClick(GeoPoint point) {

            //在此处理地图双击事件

        }


        @Override

        public void onMapLongClick(GeoPoint point) {

            //在此处理地图长按事件 

        }

    };

    mMapView.regMapTouchListner(mapTouchListener);

    

---------定位-------------------------------------------------------------

public LocationClient mLocationClient = null;

public BDLocationListener myListener = new MyLocationListener();


mLocationClient = new LocationClient(getApplicationContext());     //声明LocationClient类

    mLocationClient.registerLocationListener(myListener);    //注册监听函数

    mLocationClient.setAK("AmA3yVPLzf2XCBHeyxGHclri");

    LocationClientOption option = new LocationClientOption();

    option.setOpenGps(true);

    option.setAddrType("all");//返回的定位结果包含地址信息

    option.setCoorType("gcj02");//返回的定位结果是百度经纬度,默认值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();

mLocationClient.requestLocation();



public class MyLocationListener implements BDLocationListener {

    @Override

   public void onReceiveLocation(BDLocation location) {

      if (location == null){

     Log.v("cao", "为什么啊2");

          return ;}

      StringBuffer sb = new StringBuffer(256);

      sb.append("time : ");

      sb.append(location.getTime());

      sb.append("\nerror code : ");

      sb.append(location.getLocType());

      sb.append("\nlatitude : ");

      sb.append(location.getLatitude());

      sb.append("\nlontitude : ");

      sb.append(location.getLongitude());

      sb.append("\nradius : ");

      sb.append(location.getRadius());

      if (location.getLocType() == BDLocation.TypeGpsLocation){

           sb.append("\nspeed : ");

           sb.append(location.getSpeed());

           sb.append("\nsatellite : ");

           sb.append(location.getSatelliteNumber());

           } else if (location.getLocType() == BDLocation.TypeNetWorkLocation){

           sb.append("\naddr : ");

           sb.append(location.getAddrStr());

        } 

 

      Log.v("SS", sb.toString());

    }

public void onReceivePoi(BDLocation poiLocation) {

         if (poiLocation == null){

        Log.v("cao", "为什么啊");

                return ;

          }

         StringBuffer sb = new StringBuffer(256);

          sb.append("Poi time : ");

          sb.append(poiLocation.getTime());

          sb.append("\nerror code : ");

          sb.append(poiLocation.getLocType());

          sb.append("\nlatitude : ");

          sb.append(poiLocation.getLatitude());

          sb.append("\nlontitude : ");

          sb.append(poiLocation.getLongitude());

          sb.append("\nradius : ");

          sb.append(poiLocation.getRadius());

          if (poiLocation.getLocType() == BDLocation.TypeNetWorkLocation){

              sb.append("\naddr : ");

              sb.append(poiLocation.getAddrStr());

         } 

          if(poiLocation.hasPoi()){

               sb.append("\nPoi:");

               sb.append(poiLocation.getPoi());

         }else{             

               sb.append("noPoi information");

          }

          Log.v("SS", sb.toString());

        }

}


-------------------------地图上显示文字-----------------------------------------------------

Symbol textSymbol = new Symbol();      //文字颜色

Symbol.Color textColor = textSymbol.new Color();    

textColor.alpha = 255;    

textColor.red = 0;    

textColor.blue = 255;    

textColor.green = 0;    

             

Symbol textSymbol1 = new Symbol();      //背景

Symbol.Color textColor1 = textSymbol1.new Color();    

textColor1.alpha = 150;    

textColor1.red = 80;    

textColor1.blue = 80;    

textColor1.green = 80;    

//---------------------------------------------

TextItem textItem = new TextItem();  

textItem.fontColor = textColor;  //文字颜色

textItem.bgColor = textColor1;   //背景

textItem.fontSize = 30;  

textItem.text = "欢迎使用百度地图SDK!";  

textItem.pt = mMapView.getMapCenter();  

//-------------------------------------------

TextOverlay textOverlay = new TextOverlay(mMapView);    

textOverlay.addText(textItem);  

//--------------------------------------------------

mMapView.getOverlays().add(textOverlay);    

mMapView.refresh();   

-------------------------地图显示自己------------------------------------------------------------

MyLocationOverlay myLocationOverlay = new MyLocationOverlay(mMapView);

LocationData locData = new LocationData();

//手动将位置源置为天安门,在实际应用中,请使用百度定位SDK获取位置信息,要在SDK中显示一个位置,需要使用百度经纬度坐标(bd09ll)

locData.latitude = 39.945;

locData.longitude = 116.404;

locData.direction = 2.0f;

myLocationOverlay.setData(locData);

mMapView.getOverlays().add(myLocationOverlay);

mMapView.refresh();

mMapView.getController().animateTo(new GeoPoint((int)(locData.latitude*1e6),

(int)(locData.longitude* 1e6)));

------------------------------地图显示多图-------------------------------------------------------------

1 先新建一个类

package com.wms.shequ;

import android.content.Context;

import android.graphics.drawable.Drawable;

import android.widget.Toast;


import com.baidu.mapapi.map.ItemizedOverlay;

import com.baidu.mapapi.map.MapView;

import com.baidu.mapapi.map.OverlayItem;

import com.baidu.platform.comapi.basestruct.GeoPoint;



public class OverlayTest extends ItemizedOverlay<OverlayItem> {

  //用MapView构造ItemizedOverlay  

    public OverlayTest(Drawable mark,MapView mapView){  

               super(mark,mapView);  

    }  

    protected boolean onTap(int index) {  

        //在此处理item点击事件  

        System.out.println("item onTap: "+index);  

        Toast.makeText(C, "item"+index, 1).show();

        return true;  

    }  

        public boolean onTap(GeoPoint pt, MapView mapView){  

                //在此处理MapView的点击事件,当返回 true时  

                super.onTap(pt,mapView);  

                return false;  

        }  

}



double mLat1 = 39.90923;  

double mLon1 = 116.397428;  

double mLat2 = 39.9022;  

double mLon2 = 116.3922;  

double mLat3 = 39.917723;  

double mLon3 = 116.3722;  

// 用给定的经纬度构造GeoPoint,单位是微度 (度 * 1E6)  

GeoPoint p1 = new GeoPoint((int) (mLat1 * 1E6), (int) (mLon1 * 1E6));  

GeoPoint p2 = new GeoPoint((int) (mLat2 * 1E6), (int) (mLon2 * 1E6));  

GeoPoint p3 = new GeoPoint((int) (mLat3 * 1E6), (int) (mLon3 * 1E6));  

//准备overlay图像数据,根据实情情况修复  

Drawable mark= getResources().getDrawable(R.drawable.e1);  

Drawable mark2= getResources().getDrawable(R.drawable.ic_launcher);  

//用OverlayItem准备Overlay数据  

OverlayItem item1 = new OverlayItem(p1,"item1","item1");  

//使用setMarker()方法设置overlay图片,如果不设置则使用构建ItemizedOverlay时的默认设置  

OverlayItem item2 = new OverlayItem(p2,"item2","item2");  

item2.setMarker(mark2);  

OverlayItem item3 = new OverlayItem(p3,"item3","item3");  

  

//创建IteminizedOverlay  

OverlayTest itemOverlay = new OverlayTest(mark, mMapView,map4.this);  

//将IteminizedOverlay添加到MapView中  

 

mMapView.getOverlays().clear();  

mMapView.getOverlays().add(itemOverlay);  

  

//现在所有准备工作已准备好,使用以下方法管理overlay.  

//添加overlay, 当批量添加Overlay时使用addItem(List<OverlayItem>)效率更高  

itemOverlay.addItem(item1);  

itemOverlay.addItem(item2);  

itemOverlay.addItem(item3);  

mMapView.refresh();  

//删除overlay .  

//itemOverlay.removeItem(itemOverlay.getItem(0));  

//mMapView.refresh();  

//清除overlay  

// itemOverlay.removeAll();  

// mMapView.refresh();