首页 > 代码库 > 使用百度地图SDK

使用百度地图SDK

百度地图 SDK升级了,所以就试试这个新版的,发现和以前的又很多不一样的地方,但是熟悉以前的版本改动挺大的,想设置个MapView的各种参数都不知道怎么搞,摸索了很久才有点眉目-_-!

尤其是百度的API文档,简直让人抓狂...

实现功能:使用自定义的Fragment作为百度地图,可以自动定位,手动定位,定位标志等等..

还可以实现更多的功能...

首先下载好百度地图的最新SDK  定位SDKv4.2   ,   地图SDKv3.0.0

按照官方说明,下载好sdk,导入工程

需要先到百度控制台申请ak,然后再 manifest中添加各种权限和ak配置,Service

 

直接上代码了

java

  1 /**  2  *   3  */  4 package cn.edu.hstc.xszn.ui;  5   6 import android.annotation.SuppressLint;  7 import android.content.Context;  8 import android.os.Bundle;  9 import android.support.v4.app.Fragment; 10 import android.view.LayoutInflater; 11 import android.view.View; 12 import android.view.View.OnClickListener; 13 import android.view.ViewGroup; 14 import android.widget.ImageButton; 15 import android.widget.TextView; 16 import android.widget.Toast; 17 import cn.edu.hstc.xszn.R; 18 import cn.edu.hstc.xszn.common.L; 19  20 import com.baidu.location.BDLocation; 21 import com.baidu.location.BDLocationListener; 22 import com.baidu.location.LocationClient; 23 import com.baidu.location.LocationClientOption; 24 import com.baidu.location.LocationClientOption.LocationMode; 25 import com.baidu.mapapi.SDKInitializer; 26 import com.baidu.mapapi.map.BaiduMap; 27 import com.baidu.mapapi.map.BaiduMap.OnMyLocationClickListener; 28 import com.baidu.mapapi.map.InfoWindow; 29 import com.baidu.mapapi.map.InfoWindow.OnInfoWindowClickListener; 30 import com.baidu.mapapi.map.MapStatus; 31 import com.baidu.mapapi.map.MapStatusUpdate; 32 import com.baidu.mapapi.map.MapStatusUpdateFactory; 33 import com.baidu.mapapi.map.MapView; 34 import com.baidu.mapapi.map.MyLocationConfigeration; 35 import com.baidu.mapapi.map.MyLocationData; 36 import com.baidu.mapapi.model.LatLng; 37  38 /** 39  * @Description 40  * @author act262 41  * @version 1.0 42  * @since 2014-6-27 上午10:49:39 43  *  44  */ 45 @SuppressLint("ValidFragment") 46 public class FragmentCampusBaiduMap extends Fragment { 47  48     /** 定位按钮 */ 49     private ImageButton locateButton; 50     /** 地图View */ 51     private MapView mapView = null; 52     /** 百度地图的实体 */ 53     private BaiduMap baiduMap = null; 54     /** 百度定位核心 */ 55     private LocationClient locationClient = null; 56     /** 位置变化监听 */ 57     private LocationListener listener; 58     /** 当前定位的数据 */ 59     private MyLocationData locationData; 60     /** 弹出窗覆盖物 */ 61     private InfoWindow infoWindow; 62     /** 显示当前位置的信息小窗口 */ 63     private View tipView; 64     /** 显示在小窗口上的文字 */ 65     private TextView tipTextView; 66  67     /** 首次定位 */ 68     private boolean isFirstLocate = true; 69  70     private final String TAG = this.getClass().getSimpleName(); 71  72     public static FragmentCampusBaiduMap getInstance(Context context) { 73         return new FragmentCampusBaiduMap(context); 74     } 75  76     public FragmentCampusBaiduMap(Context context) { 77         // 使用百度map时必须的初始化工作 78         SDKInitializer.initialize(context); 79     } 80  81     @Override 82     public void onCreate(Bundle arg0) { 83         super.onCreate(arg0); 84         L.d(TAG, "onCreate"); 85     } 86  87     @Override 88     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle arg2) { 89         L.d(TAG, "onCreateView"); 90         View rootView = inflater.inflate(R.layout.fragment_campus_baidumap, null); 91         mapView = (MapView) rootView.findViewById(R.id.mapView_fragment_campus_baidumap); 92         locateButton = (ImageButton) rootView.findViewById(R.id.ib_fragment_campus_baidumap_locate); 93         locateButton.setOnClickListener(new OnClickListener() { 94             public void onClick(View v) { 95                 requestLocate(); // 手动请求定位 96             } 97         }); 98  99         // 初始化小窗口100         tipView = inflater.inflate(R.layout.view_fragment_campus_baidumap_location_tip, null);101         tipTextView = (TextView) tipView.findViewById(R.id.tv_view_fragment_campus_baidumap_location_tip);102         return rootView;103     }104 105     // 手动请求定位106     private void requestLocate() {107         Toast.makeText(getActivity(), "正在定位...", Toast.LENGTH_SHORT).show();108         if (locationClient != null && locationClient.isStarted()) {109             locationClient.requestLocation();110         } else {111             Toast.makeText(getActivity(), "定位失败", Toast.LENGTH_SHORT).show();112         }113     }114 115     boolean isShowInfoWindow = false;116 117     private void initMap() {118         baiduMap = mapView.getMap();119         baiduMap.setOnMyLocationClickListener(new OnMyLocationClickListener() {120 121             @Override122             public boolean onMyLocationClick() {123                 if (isShowInfoWindow) {124                     isShowInfoWindow = false;125                     baiduMap.hideInfoWindow();126                 } else {127                     isShowInfoWindow = true;128                     baiduMap.showInfoWindow(infoWindow);129                 }130                 return false;131             }132         });133 134         // 开启定位图层135         baiduMap.setMyLocationEnabled(true);136         // 设置百度地图的一些状态,放大等级,137         baiduMap.setMapStatus(MapStatusUpdateFactory.newMapStatus(new MapStatus.Builder(baiduMap.getMapStatus()).zoom(16).build())); // 设置放大等级为16138         // 配置定位图层显示方式,一定要开启了定位图层后再设置139         baiduMap.setMyLocationConfigeration(new MyLocationConfigeration(MyLocationConfigeration.LocationMode.FOLLOWING, true, null)); // 设置为跟随模式,显示手机方向的箭头140 141         locationClient = new LocationClient(getActivity().getApplicationContext());142         listener = new LocationListener();143         locationClient.registerLocationListener(listener); // 注册位置监听器144 145         // 定位参数控制146         LocationClientOption option = new LocationClientOption();147         option.setLocationMode(LocationMode.Hight_Accuracy);// 设置定位模式148         option.setOpenGps(true); // 打开GPS149         option.setTimeOut(10 * 1000); // 超时150         option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02151         option.setScanSpan(60 * 1000);// 设置发起定位请求的间隔时间为5000ms,将自动发起请求152         option.setIsNeedAddress(true);// 返回的定位结果包含地址信息153         option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向154         locationClient.setLocOption(option);155 156     }157 158     @Override159     public void onStart() {160         super.onStart();161         initMap();162         locationClient.start(); // 启动定位,发起第一次自动请求163     }164 165     @Override166     public void onResume() {167         // MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()168         mapView.onResume();169         super.onResume();170     }171 172     @Override173     public void onPause() {174         mapView.onPause();175         super.onPause();176     }177 178     @Override179     public void onDestroy() {180         if (locationClient != null) {181             locationClient.stop(); // 退出停止定位182         }183         baiduMap.setMyLocationEnabled(false); // 关闭定位图层184         mapView.onDestroy();185         mapView = null;186         super.onDestroy();187     }188 189     private class LocationListener implements BDLocationListener {190 191         private void initInfoWindow(LatLng point) {192             OnInfoWindowClickListener infoWindowClickListener = new OnInfoWindowClickListener() {193                 @Override194                 public void onInfoWindowClick() {195                     baiduMap.hideInfoWindow();196                     isShowInfoWindow = false;197                 }198             };199             infoWindow = new InfoWindow(tipView, point, infoWindowClickListener);200         }201 202         @Override203         public void onReceiveLocation(BDLocation location) {204             L.d(TAG, "onReceiveLocation");205             if (location == null) {206                 return;207             }208             StringBuffer sb = new StringBuffer(256);209             sb.append("time : ");210             sb.append(location.getTime());211             sb.append("\nerror code : ");212             sb.append(location.getLocType()); // 定位方式213             sb.append("\nlatitude : ");214             sb.append(location.getLatitude()); // 纬度215             sb.append("\nlontitude : ");216             sb.append(location.getLongitude()); // 经度217             sb.append("\nradius : ");218             sb.append(location.getRadius()); // 定位精度219             sb.append("\ndirection : ");220             sb.append(location.getDirection()); // 手机当前方向221             sb.append("\naltitude : ");222             sb.append(location.getAltitude()); // 高度223             sb.append("\bspeed : ");224             sb.append(location.getSpeed()); // 速度225             sb.append("\noperators : ");226             sb.append(location.getOperators());227             if (location.getLocType() == BDLocation.TypeGpsLocation) {228                 sb.append("\nspeed : ");229                 sb.append(location.getSpeed());230                 sb.append("\nsatellite : ");231                 sb.append(location.getSatelliteNumber()); // 卫星数232             } else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {233                 sb.append("\naddr : ");234                 sb.append(location.getAddrStr()); // 详细地址信息235                 sb.append("\nprovince:");236                 sb.append(location.getProvince()); //237                 sb.append("\ncity:");238                 sb.append(location.getCity()); // 城市239                 sb.append("\ndistrict:");240                 sb.append(location.getDistrict()); // 区县241             }242             L.d(TAG, sb.toString());243 244             locationData = http://www.mamicode.com/new MyLocationData.Builder().accuracy(location.getRadius()) // 定位的精确度245                     .direction(location.getDirection()) // 定位的方向 0~360度246                     .latitude(location.getLatitude()).longitude(location.getLongitude()) // 经纬度247                     .speed(location.getSpeed()).build();248 249             // 设置定位数据到定位图层上,就是显示当前位置的那个点和圆圈250             baiduMap.setMyLocationData(locationData);251 252             LatLng point = new LatLng(location.getLatitude(), location.getLongitude());253             // 我的地理位置254             String myPosition = "我的位置\n" + location.getAddrStr();255 256             // 第一次进入百度地图257             if (isFirstLocate) {258                 isFirstLocate = false;259                 // 移动到我的位置260                 // baiduMap.animateMapStatus(MapStatusUpdateFactory.newLatLng(point),261                 // 600); // 默认动画效果时间300ms262             }263 264             // 基于原来的status上改变指定的参数265             MapStatus mapStatus = new MapStatus.Builder(baiduMap.getMapStatus()).target(point).build();266             MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newMapStatus(mapStatus);267             baiduMap.animateMapStatus(mapStatusUpdate); // 改变,这里设置成随着移动而改变位置268 269             // 显示小窗口信息270             if (location.getAddrStr().length() > 0) {271                 initInfoWindow(point);272 273                 tipTextView.setText("" + myPosition);274                 isShowInfoWindow = true;275                 // 设置显示我的位置276                 baiduMap.showInfoWindow(infoWindow); // 显示277             }278         }279     }280 281 }
View Code

Fragment的布局.xml

 1 <?xml version="1.0" encoding="utf-8"?> 2 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 3     android:layout_width="match_parent" 4     android:layout_height="match_parent" > 5  6     <!-- 百度地图的 MapView --> 7  8     <com.baidu.mapapi.map.MapView 9         android:id="@+id/mapView_fragment_campus_baidumap"10         android:layout_width="match_parent"11         android:layout_height="match_parent"12         android:clickable="true" />13 14     <!-- 手动定位按钮 -->15 16     <ImageButton17         android:id="@+id/ib_fragment_campus_baidumap_locate"18         android:layout_width="wrap_content"19         android:layout_height="wrap_content"20         android:layout_alignParentRight="true"21         android:layout_alignParentTop="true"22         android:layout_marginRight="25dp"23         android:layout_marginTop="10dp"24         android:background="@drawable/ic_baidumap_locate" />25 26 </RelativeLayout>

 

tip弹窗布局.xml

 1 <?xml version="1.0" encoding="utf-8"?> 2 <!-- 我的位置提示 --> 3 <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 4     android:layout_width="wrap_content" 5     android:layout_height="wrap_content" > 6  7     <TextView 8         android:id="@+id/tv_view_fragment_campus_baidumap_location_tip" 9         android:layout_width="wrap_content"10         android:layout_height="wrap_content"11         android:background="@drawable/bg_location_tips"12         android:gravity="center"13         android:textColor="@android:color/white"14         android:textSize="16sp" />15 16 </FrameLayout>

 

在MainActivity中使用这个Fragment就好了

运行效果图