这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战
概述
本篇内容主要是对开发Flutter的过程中,集成百度地图的定位功能的时候遇到的问题做了一个整理,主要是Android端的集成整理,ios端的请查看官方文档。
在开发项目的时候,很多时候都会用到定位功能,一开始是准备使用location这个包去做定位的功能的,但是在使用华为手机做测试的时候发现,由于华为手机上无法使用GMS服务,导致无法使用这个包。
后面又准备使用高德地图的Flutter插件做定位的功能,但是根据官方文档集成之后发现始终无法正常运行项目,各种报错。最后就使用了百度地图的定位功能,虽然也有一些小问题,但是按照官方文档集成之后还是可能正常跑起来的。这篇文章就是对使用百度地图的Flutter插件过程中遇到的问题进行一个整理。
集成过程
集成过程主要就是根据 官方文档的步骤去集成的,另外就是可以下载官方的demo去看其中的使用方法。
- 申请Android端的AK
首先我们需要在百度地图的开发者网站上去申请一个AK。需要用到当前应用的包名和签名信息,获取到报名和签名之后直接申请就会分配一个AK。
- 配置Android端的AK
申请到AK之后,我们需要将申请的AK配置到项目的Manifest文件中,如下所示:
<!--百度地图定位配置-->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="申请的AK填写到此处" />
- 在项目的
pubspec.yaml文件中添加百度地图的插件,如下所示:
#百度地图定位所需的插件
flutter_bmflocation: ^2.0.0-nullsafety.1
目前这就是最新版本,最新版本可以在pub.dev网站上查到。添加了插件之后就可以执行flutter pub get下载插件了。
- 使用定位功能
经过上面三步的操作,我们已经可以在项目里面正式使用定位功能了,由于我的项目里面很多地方都需要使用到定位功能,所以做了一个工具类,在这里获取定位信息,下面是我获取定位信息的代码。
首先是定义执行定位操作的插件对象.
//执行定位的插件
final LocationFlutterPlugin _plugin = LocationFlutterPlugin();
接着需要对插件进行配置.
//配置信息
void _setUpLocation() {
/// android 端设置定位参数
BaiduLocationAndroidOption androidOption = new BaiduLocationAndroidOption();
androidOption.setCoorType("bd09ll"); // 设置返回的位置坐标系类型
androidOption.setIsNeedAltitude(true); // 设置是否需要返回海拔高度信息
androidOption.setIsNeedAddres(true); // 设置是否需要返回地址信息
androidOption.setIsNeedLocationPoiList(false); // 设置是否需要返回周边poi信息
androidOption.setIsNeedNewVersionRgc(true); // 设置是否需要返回最新版本rgc信息
androidOption.setIsNeedLocationDescribe(true); // 设置是否需要返回位置描述
androidOption.setOpenGps(true); // 设置是否需要使用gps
androidOption.setLocationMode(LocationMode.Hight_Accuracy); // 设置定位模式
androidOption.setScanspan(0); // 设置发起定位请求时间间隔,设置为0表示只执行一次定位
Map androidMap = androidOption.getMap();
/// ios 端设置定位参数
BaiduLocationIOSOption iosOption = new BaiduLocationIOSOption();
iosOption.setIsNeedNewVersionRgc(true); // 设置是否需要返回最新版本rgc信息
iosOption.setBMKLocationCoordinateType(
"BMKLocationCoordinateTypeBMK09LL"); // 设置返回的位置坐标系类型
iosOption.setActivityType("CLActivityTypeAutomotiveNavigation"); // 设置应用位置类型
iosOption.setLocationTimeout(10); // 设置位置获取超时时间
iosOption.setDesiredAccuracy("kCLLocationAccuracyBest"); // 设置预期精度参数
iosOption.setReGeocodeTimeout(10); // 设置获取地址信息超时时间
iosOption.setDistanceFilter(100); // 设置定位最小更新距离
iosOption.setAllowsBackgroundLocationUpdates(true); // 是否允许后台定位
iosOption.setPauseLocUpdateAutomatically(true); // 定位是否会被系统自动暂停
Map iosMap = iosOption.getMap();
_plugin.prepareLoc(androidMap, iosMap);
}
接下来是一个开始定位的方法:
//获取位置信息
void getLocation(void Function(Map<String, Object>?)? callback) {
_plugin.onResultCallback().listen(callback);
_setUpLocation();
_plugin.startLocation();
}
在这里我这边是直接通过一个接口将返回的数据回调出去的,在外部去处理这个定位数据。定位数据返回过来的是Map<String,dynamic>对象,百度地图插件本身已经提供了BaiduLocation,可以通过BaiduLocation.fromMap()直接将请求的地址信息转换为对象。
最后是一个关闭定位的方法:
//停止定位
void stopLocation() {
_plugin.stopLocation();
}
经过上面的步骤之后我们就可以正常使用定位功能了。
注意事项
-
和高德地图的
Flutter插件不同,百度地图的Flutter插件只需要在Manifest文件中配置AK信息即可,其它的完全不用在配置了。之前多此一举在gradle中又添加了百度地图的配置,就导致引入了多个包,编译的时候就会报错。 -
配置定位option的时候,
Android和IOS端都需要配置,之前我仅配置了Android端的option,就会出错。 -
每次开启定位之前都需要重新配置一次Option,否则无法开始定位。不清楚是我设置的原因还是其它的,如果不重新设置option,则无法定位。