Flutter Android 端接入百度地图踩坑记录
目前支持 Flutter 比较好的就是百度地图了,pub.dev 显示 更新于 8 天前,而高德貌似放弃了 Flutter,其官网文档上次更新日期是 2021,flutter 插件也有三年没更新了,下面是 Flutter Android 端接入百度地图的一些踩坑记录
1. 导入依赖,修改 pubspec.yaml
yaml
flutter_bmflocation: ^3.8.0
flutter_baidu_mapapi_map: ^3.9.5
flutter_baidu_mapapi_utils: ^3.9.5
flutter_baidu_mapapi_search: ^3.9.5
flutter_baidu_mapapi_base: ^3.9.5
修改android/app/build.gradle.kts
kotlin
dependencies {
//...
implementation("com.baidu.lbsyun:BaiduMapSDK_Search:7.6.4")
implementation("com.baidu.lbsyun:BaiduMapSDK_Util:7.6.4")
// 基础定位组件(二选一)
// implementation("com.baidu.lbsyun:BaiduMapSDK_Location:9.6.4")
// 全量定位组件(二选一,包含基础定位组件)
implementation("com.baidu.lbsyun:BaiduMapSDK_Location_All:9.6.4")
// 地图组件(这些组件都包含了 BaiduMapSDK_Map,根据需求选其一)
implementation("com.baidu.lbsyun:BaiduMapSDK_Map:7.6.4")
// implementation("com.baidu.lbsyun:BaiduMapSDK_Map-BWNavi:7.6.4") // 步骑行组件
// implementation("com.baidu.lbsyun:BaiduMapSDK_Map-Navi:7.6.4") // 驾车导航组件
// implementation("com.baidu.lbsyun:BaiduMapSDK_Map-AllNavi:7.6.4") // 驾车导航+步骑行导航组件
}
2. 闪退白屏不显示
需要配置安卓端: 新建 android/app/src/main/kotlin/<package-name>/MyApplication.kt
kotlin
package com.example.app
import android.app.Application
import com.baidu.mapapi.SDKInitializer
import com.baidu.mapapi.base.BmfMapApplication
import com.baidu.mapapi.common.BaiduMapSDKException
import com.baidu.mapapi.map.OverlayUtil
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
BmfMapApplication.mContext = applicationContext
try {
SDKInitializer.setAgreePrivacy(this, false)
SDKInitializer.initialize(this)
OverlayUtil.setOverlayUpgrade(false)
} catch (e: BaiduMapSDKException) {
e.message
}
}
}
修改 android/app/src/main/AndroidManifest.xml
, 设置 application.android:name 为 MyApplication 的全限定名
xml
<application
android:name="com.example.app.MyApplication">
<!-- ... -->
<!-- 添加 ApiKey -->
<meta-data
android:name="com.baidu.lbsapi.API_KEY"
android:value="${baiduMapApiKey}" />
</application>
修改android/app/build.gradle.kts
kotlin
android {
// ...
buildTypes {
debug {
// ...
manifestPlaceholders["baiduMapApiKey"] = localProperties["baiduMapApiKeyDebug"] as String?
?: "your_baidu_key_debug"
}
release {
// ...
manifestPlaceholders["baiduMapApiKey"] = localProperties["baiduMapApiKeyRelease"] as String?
?: "your_baidu_key_release"
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
}
3. Release 版本从桌面点击启动立即闪退,一般是代码混淆配置问题
修改android/app/build.gradle.kts
kotlin
android {
// ...
buildTypes {
release {
// ...
// 添加防混淆配置
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
}
}
}
修改或新建 android/app/proguard-rules.pro
添加以下内容到末尾
text
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-keep class com.baidu.vi.** {*;}
-dontwarn com.baidu.**
-keep class com.baidu.location.** {*;}
# 解决逆地理编码序列化报错
-keep class com.google.gson.** { *; }
4. 设置隐私合规
dart
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
class BDMapConfig {
static const String androidApiKeyDebug = "your_android_key_debug";
static const String androidApiKey = "your_android_key_release";
static const String iosApiKey = "your_ios_key";
static String get apiKey => Platform.isAndroid
? (kDebugMode ? androidApiKeyDebug : androidApiKey)
: iosApiKey;
BDMapConfig._();
}
Future<void> initBDmap() async {
print("initial bdmap...");
BMFMapSDK.setAgreePrivacy(true);
BMFMapSDK.setApiKeyAndCoordType(BDMapConfig.apiKey, BMF_COORD_TYPE.COMMON);
}
void main() {
WidgetsFlutterBinding.ensureInitialized();
initBDmap();
}
5. 定位插件隐私合规
dart
void initLocation() {
final LocationFlutterPlugin _myLocPlugin = LocationFlutterPlugin();
_myLocPlugin.setAgreePrivacy(true);
}