首页 > 代码库 > 使用百度地图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 }
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就好了
运行效果图
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。