1 首先申请百度API key:http://lbsyun.baidu.com/index.php?title=androidsdk/guide/create-project/ak
2 将百度API文件拷贝至libs文件夹中(包括jar和so文件)
3 在AndroidManifest.xml中引入
<!-- 访问网络,进行地图相关业务数据请求,包括地图数据,路线规划,POI检索等 --> <uses-permission android:name="android.permission.INTERNET" /> <!-- 获取网络状态,根据网络状态切换进行数据请求网络转换 --> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <!-- 读取外置存储。如果开发者使用了so动态加载功能并且把so文件放在了外置存储区域,则需要申请该权限,否则不需要 --> <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> <!-- 写外置存储。如果开发者使用了离线地图,并且数据写在外置存储区域,则需要申请该权限 --> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
meta-data android:name="com.baidu.lbsapi.API_KEY" android:value="API key" > </meta-data> <service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"> </service>
4 在build.gradle中 dependencies中加入
implementation fileTree(dir: 'libs' , include: ['*.jar']) androidTestCompile ('com.android.support.test.espresso: espresso-core: 2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' })
android中加入
sourceSets { main { jniLibs.srcDirs = ['libs'] } }
此时编译运行正常
5 activity_main.xml中加入baiduMap
<com.baidu.mapapi.map.MapView android:id="@+id/bmapView" android:layout_width="0dp" android:layout_height="0dp" android:clickable="true" android:focusable="true" app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintHorizontal_bias="0.0" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0"> </com.baidu.mapapi.map.MapView>
6 创建地图Activity,管理MapView生命周期
public class MainActivity extends Activity { private MapView mMapView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //获取地图控件引用 mMapView = (MapView) findViewById(R.id.bmapView); } @Override protected void onResume() { super.onResume(); //在activity执行onResume时执行mMapView. onResume (),实现地图生命周期管理 mMapView.onResume(); } @Override protected void onPause() { super.onPause(); //在activity执行onPause时执行mMapView. onPause (),实现地图生命周期管理 mMapView.onPause(); } @Override protected void onDestroy() { super.onDestroy(); //在activity执行onDestroy时执行mMapView.onDestroy(),实现地图生命周期管理 mMapView.onDestroy(); } }
此时运行,如下图所示
7 加入定位功能
(1) AndroidManifest 加入如下权限使用声明
<!-- 这个权限用于进行网络定位 --> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> <!-- 这个权限用于访问GPS定位 --> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
(2) 在Application标签中声明定位的service组件
<service android:name="com.baidu.location.f" android:enabled="true" android:process=":remote"/>
(3)开 启地图的定位图层
mBaiduMap.setMyLocationEnabled(true);
(4) 构造地图数据
public class MyLocationListener extends BDAbstractLocationListener { @Override public void onReceiveLocation(BDLocation location) { //mapView 销毁后不在处理新接收的位置 if (location == null || mMapView == null){ return; } MyLocationData locData = new MyLocationData.Builder() .accuracy(location.getRadius()) // 此处设置开发者获取到的方向信息,顺时针0-360 .direction(location.getDirection()).latitude(location.getLatitude()) .longitude(location.getLongitude()).build(); mBaiduMap.setMyLocationData(locData); } }
(5) 通过LocationClient发起定位
//定位初始化 mLocationClient = new LocationClient(this); //通过LocationClientOption设置LocationClient相关参数 LocationClientOption option = new LocationClientOption(); option.setOpenGps(true); // 打开gps option.setCoorType("bd09ll"); // 设置座标类型 option.setScanSpan(1000); //设置locationClientOption mLocationClient.setLocOption(option); //注册LocationListener监听器 MyLocationListener myLocationListener = new MyLocationListener(); mLocationClient.registerLocationListener(myLocationListener); //开启地图定位图层 mLocationClient.start();
8 需要添加以下权限,用于wifi sd卡等
//获取设备的网络状态,鉴权所需网络代理 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> //允许sd卡写权限,需写入地图数据,禁用后无法显示地图 <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> //允许sd卡读权限,需读取地图数据,禁用后无法显示地图 <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
此时运行时,可以在地图上看到定位信息,但默认地图不在光标处,在onReceiveLocation中加入如下代码
if (isFirstLoc) {
isFirstLoc = false;
LatLng ll = new LatLng(location.getLatitude(), location.getLongitude());
MapStatus.Builder builder = new MapStatus.Builder();
//设置缩放中心点;缩放比例;
builder.target(ll).zoom(18.0f);
//给地图设置状态
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
此时初次启动时,会定位至当前所在位置
9 添加复位、卫星模式、普通模式切换
在xml中加入三个按钮,activity中加入响应事件
public void onResetClick(View view){
//把定位点再次显现出来
LatLng ll = new LatLng(curLatitude, curLongitude);
MapStatus.Builder builder = new MapStatus.Builder();
//设置缩放中心点;缩放比例;
builder.target(ll).zoom(18.0f);
//给地图设置状态
mBaiduMap.animateMapStatus(MapStatusUpdateFactory.newMapStatus(builder.build()));
}
public void onNormalClick(View view) {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);
}
public void onSatelliteClick(View view) {
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
}