准备
请尽量先阅读官方文档,本文是对官方文档的合并整理,结合自己项目集成过程。
插件请以官方最新版本为主。
在使用前请先去申请百度的 key,需要提供应用 IOS 的 Bundle Identifier(包名),和 Android 的 SHA1 及包名《Android SHA1 文档》
一、项目中引入插件
flutter_bmflocation: ^1.0.4
flutter_baidu_mapapi_map: ^2.0.1
flutter_baidu_mapapi_search: ^2.0.1
flutter_baidu_mapapi_utils: ^2.0.1
二、配置 Android
- 新建 MyApplication 继承 BmfMapApplication
import com.baidu.mapapi.base.BmfMapApplication
/**
*
* @author wapchief
* @date 4/6/21
*/
class MyApplication : BmfMapApplication() {
override fun onCreate() {
super.onCreate()
}
}
- 配置 AndroidManifest.xml
- 替换 application 标签下的 name 为新建的 MyApplication;
- 同时新增一条 meta-data 标签,填写百度申请的 key;
- 添加 permission 定位权限
<!-- 这个权限用于进行网络定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 这个权限用于访问GPS定位 -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<application
android:name=".MyApplication">
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="百度AK" />
</application>
三、配置 iOS
- info.plist 配置定位权限
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>请求定位权限,获取当前位置</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>请求定位权限,获取当前位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>请求定位权限,获取当前位置</string>
-
用 Xcode 打开 ios 文件
引入下面系统文件,在TARGETS->General->Linked Frameworks and Libraries 中点击“+”
CoreLocation.framework
SystemConfiguration.framework
Security.framework
libsqlite3.0.tbd(xcode7以前为 libsqlite3.0.dylib)
CoreTelephony.framework
libc++.tbd(因需适配iOS12,需要将libstdc++.6.0.9.tbd 更新为libc++.tbd)
AdSupport.framework
-
在TARGETS->Build Settings->Other Linker Flags 中添加-ObjC
4、初始化
建议在 main 里初始化
if (Platform.isAndroid) {
BMFMapSDK.setCoordType(BMF_COORD_TYPE.BD09LL);
}else if (Platform.isIOS) {
BMFMapSDK.setApiKeyAndCoordType('替换为百度ios-AK', BMF_COORD_TYPE.BD09LL);
LocationFlutterPlugin.setApiKey("替换为百度ios-AK");
}
运行 app,如果控制台出现
ios-经纬度类型设置成功
ios-启动引擎成功
ios-授权成功
ios-联网成功
则表示配置成功
五、定位,并获取位置
- 请求定位权限
可以使用 百度提供的权限获取方法
LocationFlutterPlugin _locationPlugin = new LocationFlutterPlugin();
_locationPlugin.requestPermission();
本地可以对结果判断是否有权限,而启动定位。
- 订阅监听定位
StreamSubscription<Map<String, Object>> subscription;
subscription = locationUtils.onResultCallback().listen((Map<String, Object> result) {
LogUtils.v("baiduLocationResult:$result");
try {
baiduLocation = BaiduLocation.fromMap(result);
setState(() {});
} catch (e) {
print("errorLoaction:$e");
}
});
- 配置定位参数并启动定位
/// 设置android端和ios端定位参数
static _setLocOption() {
/// android 端设置定位参数
BaiduLocationAndroidOption androidOption = new BaiduLocationAndroidOption();
androidOption.setCoorType("bd09ll"); // 设置返回的位置坐标系类型
androidOption.setIsNeedAltitude(true); // 设置是否需要返回海拔高度信息
androidOption.setIsNeedAddres(true); // 设置是否需要返回地址信息
androidOption.setIsNeedLocationPoiList(true); // 设置是否需要返回周边poi信息
androidOption.setIsNeedNewVersionRgc(true); // 设置是否需要返回最新版本rgc信息
androidOption.setIsNeedLocationDescribe(true); // 设置是否需要返回位置描述
androidOption.setOpenGps(true); // 设置是否需要使用gps
androidOption.setLocationMode(LocationMode.Hight_Accuracy); // 设置定位模式
androidOption.setScanspan(1000); // 设置发起定位请求时间间隔
androidOption.setIsNeedLocationPoiList(true); //显示周边poi信息
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(100); // 设置获取地址信息超时时间
iosOption.setDistanceFilter(100); // 设置定位最小更新距离
iosOption.setAllowsBackgroundLocationUpdates(true); // 是否允许后台定位
iosOption.setPauseLocUpdateAutomatically(true); // 定位是否会被系统自动暂停
Map iosMap = iosOption.getMap();
locationPlugin.prepareLoc(androidMap, iosMap);
}
///启动定位
if (null != locationPlugin) {
_setLocOption();
locationPlugin.startLocation();
}
如果定位成功,baiduLocation将接收到定位结果,并且会返回 经纬度 等数据,如果要在地图上显示坐标,则必须要先定位。
- 最后离开的时候别忘了取消订阅,关闭定位
@override
void dispose() {
super.dispose();
if (null != subscription) {
subscription.cancel();
}
if (null != locationPlugin) {
locationPlugin.stopLocation();
}
}
六、在地图上显示定位
- 创建地图组建
AspectRatio(
aspectRatio: 1 / 1,
child: BMFMapWidget(
onBMFMapCreated: onBMFMapCreated,
mapOptions: mapOptions ?? BMFMapOptions(),
),
)
- 监听地图绘制成功,初始化参数
/// 创建完成回调
void onBMFMapCreated(BMFMapController controller) {
myMapController = controller;
/// 地图加载回调
myMapController?.setMapDidLoadCallback(callback: () {
print('mapDidLoad-地图加载完成');
//开启定位,配置地图参数
initMap();
});
}
BMFMapController myMapController;
BMFMapOptions mapOptions;
initMap() {
//需要提供经纬度,可以参考上面定位,在定位结果回调里设置即可
mapOptions = BMFMapOptions(
center: BMFCoordinate(latitude, longitude),
zoomLevel: 12,
);
myMapController?.updateMapOptions(mapOptions);
//设置定位参数
BMFLocation location = BMFLocation(
coordinate: BMFCoordinate(latitude, longitude),
altitude: 0,
horizontalAccuracy: 5,
verticalAccuracy: -1.0,
speed: -1.0,
course: -1.0);
BMFUserLocation userLocation = BMFUserLocation(
location: location,
);
myMapController?.updateLocationData(userLocation);
//设置定位图层样式
BMFUserLocationDisplayParam displayParam = BMFUserLocationDisplayParam(
locationViewOffsetX: 0,
locationViewOffsetY: 0,
accuracyCircleFillColor: Colors.red,
accuracyCircleStrokeColor: Colors.blue,
isAccuracyCircleShow: true,
locationViewImage: R.assetsImagesIconMark,
//本地资源图标路径
locationViewHierarchy: BMFLocationViewHierarchy.LOCATION_VIEW_HIERARCHY_BOTTOM);
myMapController?.updateLocationViewWithParam(displayParam);
}
其它
POI 检索等其它方法请参考官方文档
http://lbsyun.baidu.com/index.php?title=flutter/guide/search/poi