百度地图
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();