Flutter Android 端接入百度地图踩坑记录

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);
}
相关推荐
勤劳打代码13 小时前
Flutter 架构日记 — 状态管理
flutter·架构·前端框架
alexhilton1 天前
端侧RAG实战指南
android·kotlin·android jetpack
二流小码农2 天前
鸿蒙开发:路由组件升级,支持页面一键创建
android·ios·harmonyos
xq95272 天前
Android 手游SDK组件化开发实战指南
android
比特鹰2 天前
手把手带你用Flutter手搓人生K线
前端·javascript·flutter
煤球王子2 天前
学习记录:Android14中的WiFi-wpa_supplicant(1)
android
火柴就是我2 天前
Flutter限制输入框只能输入中文,iOS拼音打不出来?
flutter
张小潇2 天前
AOSP15 Input专题InputDispatcher源码分析
android
TT_Close2 天前
【Flutter×鸿蒙】debug 包也要签名,这点和 Android 差远了
android·flutter·harmonyos
Kapaseker2 天前
2026年,我们还该不该学编程?
android·kotlin