【达内课程】酷跑项目:百度地图获取定位
原创
©著作权归作者所有:来自51CTO博客作者qq5d510d208e604的原创作品,请联系作者获取转载授权,否则将追究法律责任
1、酷跑项目:崩溃自动重启功能 2、酷跑项目:首页跳转+底部菜单联动
前提
-
百度地图开放平台注册账号
- 进入控制台,创建应用
- 打开开发文档菜单,找到Android开发,查看Android 地图SDK,了解相关功能
- 按照左侧开发指南中Android Studio配置阅读相关开发步骤,进行开发
- 在SDK下载中可下载相关开发包和全部功能Demo来参考
开发
创建地图,先显示出来试一下

实现定位功能
根据显示定位这一节,可以获取当前经纬度
这里我们实现的功能有:获取当前定位并在当前位置显示一张图片、点击地图获取点击位置的经纬度


ShopFragment
public class SportFragment extends Fragment {
private MapView mMapView = null;
//定位
LocationClient mLocationClient;
private BaiduMap mBaiduMap;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_sport,null);
//获取地图控件引用
mMapView = (MapView) view.findViewById(.bmapView);
mBaiduMap = mMapView.getMap();
//定位初始化
mLocationClient = new LocationClient(getActivity());
MyLocationListener listener = new MyLocationListener();
mLocationClient.registerLocationListener(listener);
//设置定位参数
LocationClientOption option = new LocationClientOption();
option.setOpenGps(true); // 打开gps
option.setCoorType("bd09ll"); // 设置坐标类型
option.setScanSpan(1);// 每隔多少毫秒获取一次坐标,这里是1s
//option.setScanSpan(1000);// 每隔多少毫秒获取一次坐标,这里是1s
//如果小于1000,只获取1次,如果想再次定位则使用以下方法
//mLocationClient.requestLocation();
//设置locationClientOption
mLocationClient.setLocOption(option);
//开启地图定位图层
mLocationClient.start();
return view;
}
@Override
public void onResume() {
super.onResume();
//在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理
mMapView.onResume();
}
@Override
public void onPause() {
super.onPause();
//在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理
mMapView.onPause();
}
@Override
public void onDestroy() {
super.onDestroy();
//在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理
mMapView.onDestroy();
}
class MyLocationListener extends BDAbstractLocationListener{
@Override
public void onReceiveLocation(BDLocation bdLocation) {
//经度
double longitude = bdLocation.getLongitude();
//纬度
final double latitude = bdLocation.getLatitude();
Log.d("Debug","经度:"+longitude+",纬度:"+latitude);
//移动地图
LatLng latLng = new LatLng(latitude,longitude);
MapStatusUpdate mapStatusUpdate = MapStatusUpdateFactory.newLatLngZoom(latLng,17);
mBaiduMap.animateMapStatus(mapStatusUpdate);
//显示图片
MarkerOptions options = new MarkerOptions();
options.position(latLng);
BitmapDescriptor bitmapDescriptor = BitmapDescriptorFactory.fromResource(R.mipmap.icon_marker);
options.icon(bitmapDescriptor);
mBaiduMap.addOverlay(options);
//在地图上单击
mBaiduMap.setOnMapClickListener(new BaiduMap.OnMapClickListener() {
@Override
public void onMapClick(LatLng latLng) {
//清除地图上的图片
mBaiduMap.clear();
Log.d("Debug","单击的位置是:"+latLng.latitude+","+latLng.longitude);
//单击的位置显示图片
MarkerOptions options = new MarkerOptions();
options.position(latLng);
options.icon(BitmapDescriptorFactory.fromResource(R.mipmap.icon_marker));
mBaiduMap.addOverlay(options);
}
@Override
public boolean onMapPoiClick(MapPoi mapPoi) {
return false;
}
});
}
}
}
注意:用真机测试,同时权限中同意定位权限
这里我们打印了经纬度,获取经纬度后,可以在百度拾取坐标系统中验证
可能出现的问题
setScanSpan()方法不起作用
上边代码中每隔1s定位一次,可能会出现的情况是,只定位了一次,然后就不再定位了。原因可能是AndroidManifest中没有在application中增加以下代码
<service android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote"/>