準(zhǔn)備
請(qǐng)盡量先閱讀官方文檔,本文是對(duì)官方文檔的合并整理脊僚,結(jié)合自己項(xiàng)目集成過程轩端。
插件請(qǐng)以官方最新版本為主。
在使用前請(qǐng)先去申請(qǐng)百度的 key巡社,需要提供應(yīng)用 IOS 的 Bundle Identifier(包名),和 Android 的 SHA1 及包名《Android SHA1 文檔》
一啸盏、項(xiàng)目中引入插件
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 標(biāo)簽下的 name 為新建的 MyApplication;
- 同時(shí)新增一條 meta-data 標(biāo)簽回懦,填寫百度申請(qǐng)的 key;
- 添加 permission 定位權(quán)限
<!-- 這個(gè)權(quán)限用于進(jìn)行網(wǎng)絡(luò)定位 -->
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
<!-- 這個(gè)權(quán)限用于訪問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 配置定位權(quán)限
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
<key>NSLocationAlwaysAndWhenInUseUsageDescription</key>
<string>請(qǐng)求定位權(quán)限怯晕,獲取當(dāng)前位置</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>請(qǐng)求定位權(quán)限,獲取當(dāng)前位置</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>請(qǐng)求定位權(quán)限缸棵,獲取當(dāng)前位置</string>
-
用 Xcode 打開 ios 文件
引入下面系統(tǒng)文件舟茶,在TARGETS->General->Linked Frameworks and Libraries 中點(diǎn)擊“+”
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");
}
運(yùn)行 app吧凉,如果控制臺(tái)出現(xiàn)
ios-經(jīng)緯度類型設(shè)置成功
ios-啟動(dòng)引擎成功
ios-授權(quán)成功
ios-聯(lián)網(wǎng)成功
則表示配置成功
五、定位踏志,并獲取位置
- 請(qǐng)求定位權(quán)限
可以使用 百度提供的權(quán)限獲取方法
LocationFlutterPlugin _locationPlugin = new LocationFlutterPlugin();
_locationPlugin.requestPermission();
本地可以對(duì)結(jié)果判斷是否有權(quán)限阀捅,而啟動(dòng)定位。
- 訂閱監(jiān)聽定位
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");
}
});
- 配置定位參數(shù)并啟動(dòng)定位
/// 設(shè)置android端和ios端定位參數(shù)
static _setLocOption() {
/// android 端設(shè)置定位參數(shù)
BaiduLocationAndroidOption androidOption = new BaiduLocationAndroidOption();
androidOption.setCoorType("bd09ll"); // 設(shè)置返回的位置坐標(biāo)系類型
androidOption.setIsNeedAltitude(true); // 設(shè)置是否需要返回海拔高度信息
androidOption.setIsNeedAddres(true); // 設(shè)置是否需要返回地址信息
androidOption.setIsNeedLocationPoiList(true); // 設(shè)置是否需要返回周邊poi信息
androidOption.setIsNeedNewVersionRgc(true); // 設(shè)置是否需要返回最新版本rgc信息
androidOption.setIsNeedLocationDescribe(true); // 設(shè)置是否需要返回位置描述
androidOption.setOpenGps(true); // 設(shè)置是否需要使用gps
androidOption.setLocationMode(LocationMode.Hight_Accuracy); // 設(shè)置定位模式
androidOption.setScanspan(1000); // 設(shè)置發(fā)起定位請(qǐng)求時(shí)間間隔
androidOption.setIsNeedLocationPoiList(true); //顯示周邊poi信息
Map androidMap = androidOption.getMap();
/// ios 端設(shè)置定位參數(shù)
BaiduLocationIOSOption iosOption = new BaiduLocationIOSOption();
iosOption.setIsNeedNewVersionRgc(true); // 設(shè)置是否需要返回最新版本rgc信息
iosOption.setBMKLocationCoordinateType("BMKLocationCoordinateTypeBMK09LL"); // 設(shè)置返回的位置坐標(biāo)系類型
iosOption.setActivityType("CLActivityTypeAutomotiveNavigation"); // 設(shè)置應(yīng)用位置類型
iosOption.setLocationTimeout(10); // 設(shè)置位置獲取超時(shí)時(shí)間
iosOption.setDesiredAccuracy("kCLLocationAccuracyBest"); // 設(shè)置預(yù)期精度參數(shù)
iosOption.setReGeocodeTimeout(100); // 設(shè)置獲取地址信息超時(shí)時(shí)間
iosOption.setDistanceFilter(100); // 設(shè)置定位最小更新距離
iosOption.setAllowsBackgroundLocationUpdates(true); // 是否允許后臺(tái)定位
iosOption.setPauseLocUpdateAutomatically(true); // 定位是否會(huì)被系統(tǒng)自動(dòng)暫停
Map iosMap = iosOption.getMap();
locationPlugin.prepareLoc(androidMap, iosMap);
}
///啟動(dòng)定位
if (null != locationPlugin) {
_setLocOption();
locationPlugin.startLocation();
}
如果定位成功针余,baiduLocation將接收到定位結(jié)果饲鄙,并且會(huì)返回 經(jīng)緯度 等數(shù)據(jù)凄诞,如果要在地圖上顯示坐標(biāo),則必須要先定位忍级。
- 最后離開的時(shí)候別忘了取消訂閱帆谍,關(guān)閉定位
@override
void dispose() {
super.dispose();
if (null != subscription) {
subscription.cancel();
}
if (null != locationPlugin) {
locationPlugin.stopLocation();
}
}
六、在地圖上顯示定位
- 創(chuàng)建地圖組建
AspectRatio(
aspectRatio: 1 / 1,
child: BMFMapWidget(
onBMFMapCreated: onBMFMapCreated,
mapOptions: mapOptions ?? BMFMapOptions(),
),
)
- 監(jiān)聽地圖繪制成功轴咱,初始化參數(shù)
/// 創(chuàng)建完成回調(diào)
void onBMFMapCreated(BMFMapController controller) {
myMapController = controller;
/// 地圖加載回調(diào)
myMapController?.setMapDidLoadCallback(callback: () {
print('mapDidLoad-地圖加載完成');
//開啟定位汛蝙,配置地圖參數(shù)
initMap();
});
}
BMFMapController myMapController;
BMFMapOptions mapOptions;
initMap() {
//需要提供經(jīng)緯度,可以參考上面定位朴肺,在定位結(jié)果回調(diào)里設(shè)置即可
mapOptions = BMFMapOptions(
center: BMFCoordinate(latitude, longitude),
zoomLevel: 12,
);
myMapController?.updateMapOptions(mapOptions);
//設(shè)置定位參數(shù)
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);
//設(shè)置定位圖層樣式
BMFUserLocationDisplayParam displayParam = BMFUserLocationDisplayParam(
locationViewOffsetX: 0,
locationViewOffsetY: 0,
accuracyCircleFillColor: Colors.red,
accuracyCircleStrokeColor: Colors.blue,
isAccuracyCircleShow: true,
locationViewImage: R.assetsImagesIconMark,
//本地資源圖標(biāo)路徑
locationViewHierarchy: BMFLocationViewHierarchy.LOCATION_VIEW_HIERARCHY_BOTTOM);
myMapController?.updateLocationViewWithParam(displayParam);
}
其它
POI 檢索等其它方法請(qǐng)參考官方文檔
http://lbsyun.baidu.com/index.php?title=flutter/guide/search/poi