1.到百度地图页面申请key,注意key和项目包名和数字签名一一对应的。http://developer.baidu.com/map/index.php?title=%E9%A6%96%E9%A1%B5
2.下载相应的sdk包 :http://lbsyun.baidu.com/sdk/download
3. 创建项目,加入相应的包
在AndroidManifest中添加开发密钥、所需权限等信息;
(1)在application中添加开发密钥
<application <meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="开发者 key" />
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote" > </service> </application>
2)添加所需权限
<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_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" >
</uses-permission>
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" >
</uses-permission>
<!-- <uses-permission android:name="android.permission.WRITE_APN_SETTINGS"></uses-permission> -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" >
</uses-permission>
<uses-permission android:name="com.android.launcher.permission.READ_SETTINGS" />
<uses-permission android:name="android.permission.WAKE_LOCK" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.SEND_SMS" />
<!-- SDK1.5需要android.permission.GET_TASKS权限判断本程序是否为当前运行的应用? -->
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.CAMERA" >
</uses-permission>
<uses-permission android:name="android.permission.RECORD_AUDIO" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" >
</uses-permission>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
<uses-permission android:name="android.permission.BROADCAST_STICKY" />
<uses-permission android:name="android.permission.WRITE_SETTINGS" />
<!-- 来电消音 -->
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
第三步,添加布局文件 ,代码里面使用该LinearLayout把mapview添加上来
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent">
<LinearLayout android:id="@+id/map"
android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > </LinearLayout>
</RelativeLayout>
还可以这样:
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" />第一种我们可以在代码设置一些配置信息,比如去掉缩放控件
主要代码:
package com.hck.baidumap; import android.app.Activity; import android.os.Bundle; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.LinearLayout; import android.widget.TextView; import com.baidu.location.BDLocation; import com.baidu.location.BDLocationListener; import com.baidu.location.LocationClient; import com.baidu.location.LocationClientOption; import com.baidu.mapapi.SDKInitializer; import com.baidu.mapapi.map.BaiduMap; import com.baidu.mapapi.map.BaiduMap.OnMapClickListener; import com.baidu.mapapi.map.BaiduMap.OnMarkerClickListener; import com.baidu.mapapi.map.BaiduMapOptions; import com.baidu.mapapi.map.BitmapDescriptor; import com.baidu.mapapi.map.BitmapDescriptorFactory; import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener; import com.baidu.mapapi.map.InfoWindow; import com.baidu.mapapi.map.MapPoi; import com.baidu.mapapi.map.MapStatusUpdate; import com.baidu.mapapi.map.MapStatusUpdateFactory; import com.baidu.mapapi.map.MapView; import com.baidu.mapapi.map.Marker; import com.baidu.mapapi.map.MarkerOptions; import com.baidu.mapapi.map.MyLocationData; import com.baidu.mapapi.map.OverlayOptions; import com.baidu.mapapi.model.LatLng; import com.baidu.mapapi.search.geocode.GeoCodeResult; import com.baidu.mapapi.search.geocode.GeoCoder; import com.baidu.mapapi.search.geocode.OnGetGeoCoderResultListener; import com.baidu.mapapi.search.geocode.ReverseGeoCodeOption; import com.baidu.mapapi.search.geocode.ReverseGeoCodeResult; public class MainActivity extends Activity { private LinearLayout mapLayout; private MapView mMapView; private BaiduMap mBaiduMap; boolean isFirstLoc = true; private BitmapDescriptor bitmap; private InfoWindow mInfoWindow; private LocationClient mLocClient; public MyLocationListenner myListener = new MyLocationListenner(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); SDKInitializer.initialize(getApplicationContext()); //初始化地图sdk mapLayout = (LinearLayout) findViewById(R.id.map); initMap(); setListener(); } private void initMap() { BaiduMapOptions options = new BaiduMapOptions(); options.compassEnabled(false); // 不允许指南针 options.zoomControlsEnabled(false); // 不显示缩放按钮 options.scaleControlEnabled(false); // 不显示比例尺 mMapView = new MapView(this, options); // 创建一个map对象 mapLayout.addView(mMapView); // 把map添加到界面上 mBaiduMap = mMapView.getMap(); // 获取BaiduMap对象 mMapView.removeViewAt(1); // 去掉百度logo mBaiduMap.setMyLocationEnabled(false); //不显示我的位置,样覆盖物代替 mBaiduMap.setMaxAndMinZoomLevel(18, 17); //地图的最大最小缩放比例3-18 mLocClient = new LocationClient(this); //地图在tabhost中,请传入getApplicationContext() mLocClient.registerLocationListener(myListener); //绑定定位监听 LocationClientOption option = new LocationClientOption(); //配置参数 option.setOpenGps(true); option.setAddrType("all"); //设置使其可以获取具体的位置,把精度纬度换成具体地址 option.setCoorType("bd09ll"); option.setScanSpan(1000); mLocClient.setLocOption(option); mLocClient.start(); //开始定位 } public class MyLocationListenner implements BDLocationListener { //定位 @Override public void onReceiveLocation(BDLocation location) { Log.d("hck", "定位定位"); if (location == null || mMapView == null) return; MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()).direction(100) .latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); if (isFirstLoc) { Log.d("hck", "定位定位成功"); isFirstLoc = false; LatLng ll = new LatLng(location.getLatitude(), location.getLongitude()); MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(ll); mBaiduMap.animateMapStatus(u); mark(ll.latitude, ll.longitude, location.getAddrStr()); } } public void onReceivePoi(BDLocation poiLocation) { } } private void setListener() { mBaiduMap.setOnMapClickListener(new OnMapClickListener() { //点击地图事件 @Override public boolean onMapPoiClick(MapPoi arg0) { return false; } @Override public void onMapClick(LatLng arg0) { GeoCoder getCoder = GeoCoder.newInstance(); ReverseGeoCodeOption reCodeOption = new ReverseGeoCodeOption(); reCodeOption.location(arg0); getCoder.reverseGeoCode(reCodeOption); getCoder.setOnGetGeoCodeResultListener(new GetAddress()); } }); mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { //点击覆盖物事件 @Override public boolean onMarkerClick(Marker arg0) { showLocation(arg0); return false; } }); } private void showLocation(final Marker marker) { //显示气泡 // 创建InfoWindow展示的view LatLng pt = null; double latitude, longitude; latitude = marker.getPosition().latitude; longitude = marker.getPosition().longitude; View view = LayoutInflater.from(this).inflate(R.layout.map_item, null); //自定义气泡形状 TextView textView = (TextView) view.findViewById(R.id.my_postion); pt = new LatLng(latitude + 0.0004, longitude + 0.00005); textView.setText(marker.getTitle()); // 定义用于显示该InfoWindow的坐标点 // 创建InfoWindow的点击事件监听者 OnInfoWindowClickListener listener = new OnInfoWindowClickListener() { public void onInfoWindowClick() { mBaiduMap.hideInfoWindow();//影藏气泡 } }; // 创建InfoWindow mInfoWindow = new InfoWindow(view, pt, listener); mBaiduMap.showInfoWindow(mInfoWindow); //显示气泡 } private void mark(double latitude, double longitude, String title) {//显示覆盖物 // 定义Maker坐标点 LatLng point = new LatLng(latitude, longitude); // 构建Marker图标 bitmap = BitmapDescriptorFactory.fromResource(R.drawable.pointe_map); // 构建MarkerOption,用于在地图上添加Marker OverlayOptions option = new MarkerOptions().position(point) .icon(bitmap); // 在地图上添加Marker,并显示 Marker marker = (Marker) mBaiduMap.addOverlay(option); marker.setTitle(title); Bundle bundle = new Bundle(); bundle.putSerializable("recore", "ddd"); marker.setExtraInfo(bundle); } class GetAddress implements OnGetGeoCoderResultListener { //点击地图获取点击位置处的详细地址 @Override public void onGetGeoCodeResult(GeoCodeResult arg0) { } @Override public void onGetReverseGeoCodeResult(ReverseGeoCodeResult arg0) { arg0.getAddress(); mBaiduMap.hideInfoWindow(); mark(arg0.getLocation().latitude, arg0.getLocation().longitude, arg0.getAddress()); } } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } }
效果图
完整demo:http://download.csdn.net/detail/hhhccckkk/7962441