使用百度地图SDK

霸气de小男生 提交于 2020-03-23 16:24:04

百度地图 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             @Override
122             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())); // 设置放大等级为16
138         // 配置定位图层显示方式,一定要开启了定位图层后再设置
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); // 打开GPS
149         option.setTimeOut(10 * 1000); // 超时
150         option.setCoorType("bd09ll");// 返回的定位结果是百度经纬度,默认值gcj02
151         option.setScanSpan(60 * 1000);// 设置发起定位请求的间隔时间为5000ms,将自动发起请求
152         option.setIsNeedAddress(true);// 返回的定位结果包含地址信息
153         option.setNeedDeviceDirect(true);// 返回的定位结果包含手机机头的方向
154         locationClient.setLocOption(option);
155 
156     }
157 
158     @Override
159     public void onStart() {
160         super.onStart();
161         initMap();
162         locationClient.start(); // 启动定位,发起第一次自动请求
163     }
164 
165     @Override
166     public void onResume() {
167         // MapView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()
168         mapView.onResume();
169         super.onResume();
170     }
171 
172     @Override
173     public void onPause() {
174         mapView.onPause();
175         super.onPause();
176     }
177 
178     @Override
179     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                 @Override
194                 public void onInfoWindowClick() {
195                     baiduMap.hideInfoWindow();
196                     isShowInfoWindow = false;
197                 }
198             };
199             infoWindow = new InfoWindow(tipView, point, infoWindowClickListener);
200         }
201 
202         @Override
203         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 = 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); // 默认动画效果时间300ms
262             }
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     <ImageButton
17         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就好了

运行效果图

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!