(学习参考书:第一行代码第2版) 在开始之前,需要到提供LBS服务的API开发平台申请注册和申请API key。百度、高德地图均可,本文采用百度的API。
一、配置LBS SDK
- 选择所需功能下载jar文件
- 解压后将下载文件夹中libs目录下的jar文件复制到项目的app/libs文件夹下
- 在app/src/main目录下创建jniLibs目录,放入下载文件夹中除了libs的其他文件(即so文件)
- 点击Sync按钮同步,查看app/build.gradle是否存在 implementation files(…),如果不存在,在放入的jar包上右击选择add as library
二、使用百度定位
(官方参考文档:Android定位SDK描述文档)
(1)确定自己位置的经纬度 使用方法:
- 在AndroidManifest中申请权限、配置开发密钥、添加外部权限
- 在主线程声明LocationCilent对象,使用getApplicationContext()方法传入构造函数
- 调用LocationCilent对象的registerLocationListener()方法注册一个定位监听器,当获取位置信息时,会回调这个监听器。该监听器继承BDAbstractLocationListener
- 申请运行时权限,并重写onRequestPermissionResult()方法对权限申请结果进行处理。
- 若权限都允许,调用LocationCilent的start()方法定位。
- 在监听器的onReceiveLocation()方法,在其中完成对位置信息的操作。如果要更新UI,别忘了在runOnUiThread()开启子线程。
配置SDK参数: 利用LocationClientOption配置。
LocationClientOption option = new LocationClientOption();
option.setLocationMode(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);
option.setNeedNewVersionRgc(true);
mLocationClient.setLocOption(option);
(2)获取地址 同样使用LocationClientOption配置参数
option.setIsNeedAddress(true);
三、使用百度地图
(官方参考文档:Android地图SDK文档描述文档)
(1)显示地图和正确位置
- 在定位的SDK基础上,在布局文件添加MapView控件
- 在activity设置布局之前调用SDKInitializer.initialize(getApplicationContext())进行初始化操作
- 获取MapView的实例,调用MapView的getMap()方法获取到BaiduMap实例
- 通过MapStatusUpdate对象设置缩放大小和定位位置
- 使用BaiduMap对象的animateMapStatus(update)方法提交更新
- 上述4,5功能封装在一个navigateTo(BDLocation)方法中,在监听器的onReceiveLoction()方法中调用该方法
- 重写onResume()、onPause()、onDestory()三个方法,并在其中对MapView进行管理,以保证资源及时释放。
(2)显示定位光标
- 在onCreate方法中让BaiduMap对象调用setMyLocationEnabled(true)
- 百度LBS SDK当中提供了一个MyLocationData.Builder类,该类是用来封装设备当前所在位置的,只需要将经纬度信息传入在该类的对应方法中就可以了。
- 要封装的信息设置完后,调用其build()方法获得一个MyLocationData实例,传入BaiduMap的setMyLocationData()中即可
- 在onDestory()方法中让BaiduMap对象调用setMyLocationEnabled(false)
步骤2:
MyLocationData.Builder locationBuilder = new MyLocationData.Builder();
locationBuilder.latitude(location.getLatitude());
locationBuilder.longitude(location.getLongitude());
|