刚好最近毕业设计需要用到,做的过程中稍微走了下弯路,所以就mark一下
百度地图官方介绍http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/androidstudio
开发者申请的直接跳过,上述介绍的挺清楚,本文主要介绍下地图显示以及定位当前位置的实现
一、百度地图的显示
二、进行定位百度官方文档个人觉得有点乱,因为可能是为了把地图跟定位两个功能分开,所以介绍的时候两块有点凌乱,一年前有学过,当时觉得介绍挺清楚的
1、开启定位层
private void initMap() {
mBaiduMap = mMapView.getMap();
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
}
2、初始化LocationClient类
private void initLocation() {
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setCoorType("bd09ll");
option.setScanSpan(1000);
option.setOpenGps(true);
option.setLocationNotify(true);
option.setIgnoreKillProcess(false);
option.SetIgnoreCacheException(false);
option.setWifiCacheTimeOut(5*60*1000);
option.setEnableSimulateGps(false);
mLocationClient.setLocOption(option);
mLocationClient.start();
}
3、回调获取经纬度
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location){
sLocation = location;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取经纬度相关(常用)的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
// double latitude = location.getLatitude(); //获取纬度信息
// double longitude = location.getLongitude(); //获取经度信息
// float radius = location.getRadius(); //获取定位精度,默认值为0.0f
//
// String coorType = location.getCoorType();
// //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
//
// int errorCode = location.getLocType();
// //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
}
}
4、动画定位到当前位置
if(isFirstLoc){
isFirstLoc = false;
//获取经纬度
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
//mBaiduMap.setMapStatus(status);//直接到中间
mBaiduMap.animateMapStatus(status);//动画的方式到中间
}
以上为主要部分,等继续完善,遇到的一个问题就是没有弹出定位权限申请框,所以一直定位错了,最后找到应用打开权限就可以了
三、源码
package com.example.wzhworld.bddemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
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.BitmapDescriptor;
import com.baidu.mapapi.map.BitmapDescriptorFactory;
import com.baidu.mapapi.map.MapStatusUpdate;
import com.baidu.mapapi.map.MapStatusUpdateFactory;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationConfiguration;
import com.baidu.mapapi.map.MyLocationData;
import com.baidu.mapapi.model.LatLng;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
public LocationClient mLocationClient = null;
private MyLocationListener myListener = new MyLocationListener();
private BaiduMap mBaiduMap;
private MyLocationConfiguration.LocationMode mCurrentMode = MyLocationConfiguration.LocationMode.NORMAL;
private BitmapDescriptor mCurrentMarker;
private BDLocation sLocation;
private Button locButton;
private MapView mMapView = null;
private boolean isFirstLoc = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SDKInitializer.initialize(getApplicationContext());
setContentView(R.layout.activity_main);
initView();
initMap();
initLocation();
}
private void initMap() {
mBaiduMap = mMapView.getMap();
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
// 开启定位图层
mBaiduMap.setMyLocationEnabled(true);
}
private void initView() {
locButton = (Button)findViewById(R.id.loc);
locButton.setOnClickListener(this);
mMapView = (MapView) findViewById(R.id.bmapView);
mMapView.removeViewAt(1);
// mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.traffic1);
}
private void initLocation() {
mLocationClient = new LocationClient(getApplicationContext());
mLocationClient.registerLocationListener(myListener);
LocationClientOption option = new LocationClientOption();
option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
option.setCoorType("bd09ll");
option.setScanSpan(1000);
option.setOpenGps(true);
option.setLocationNotify(true);
option.setIgnoreKillProcess(false);
option.SetIgnoreCacheException(false);
option.setWifiCacheTimeOut(5*60*1000);
option.setEnableSimulateGps(false);
mLocationClient.setLocOption(option);
mLocationClient.start();
}
@Override
public void onClick(View view) {
if(R.id.loc == view.getId()){
LatLng ll = new LatLng(sLocation.getLatitude(),sLocation.getLongitude());
MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
//mBaiduMap.setMapStatus(status);//直接到中间
mBaiduMap.animateMapStatus(status);//动画的方式到中间
}
// 构造定位数据
// mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(
// mCurrentMode, true, mCurrentMarker));
}
public class MyLocationListener implements BDLocationListener {
@Override
public void onReceiveLocation(BDLocation location){
sLocation = location;
MyLocationData locData = new MyLocationData.Builder()
.accuracy(location.getRadius())
// 此处设置开发者获取到的方向信息,顺时针0-360
.direction(100).latitude(location.getLatitude())
.longitude(location.getLongitude()).build();
// 设置定位数据
mBaiduMap.setMyLocationData(locData);
//此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
//以下只列举部分获取经纬度相关(常用)的结果信息
//更多结果信息获取说明,请参照类参考中BDLocation类中的说明
if(isFirstLoc){
isFirstLoc = false;
//获取经纬度
LatLng ll = new LatLng(location.getLatitude(),location.getLongitude());
MapStatusUpdate status = MapStatusUpdateFactory.newLatLng(ll);
//mBaiduMap.setMapStatus(status);//直接到中间
mBaiduMap.animateMapStatus(status);//动画的方式到中间
// Log.e("位置:" , location.getAddrStr());
}
Log.e("here",location.getLatitude()+"|"+location.getLongitude());
// double latitude = location.getLatitude(); //获取纬度信息
// double longitude = location.getLongitude(); //获取经度信息
// float radius = location.getRadius(); //获取定位精度,默认值为0.0f
//
// String coorType = location.getCoorType();
// //获取经纬度坐标类型,以LocationClientOption中设置过的坐标类型为准
//
// int errorCode = location.getLocType();
// //获取定位类型、定位错误返回码,具体信息可参照类参考中BDLocation类中的说明
}
}
@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();
}
}