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);
}
相关推荐
ujainu9 小时前
Flutter + OpenHarmony 游戏开发进阶:用户输入响应——GestureDetector 实现点击发射
flutter·游戏·openharmony
Doro再努力9 小时前
【Linux操作系统10】Makefile深度解析:从依赖推导到有效编译
android·linux·运维·服务器·编辑器·vim
Daniel李华9 小时前
echarts使用案例
android·javascript·echarts
hudawei9969 小时前
TweenAnimationBuilder和AnimatedBuilder两种动画的比较
flutter·ui·动画·tweenanimation·animatedbuilder
ujainu10 小时前
Flutter + OpenHarmony 实现无限跑酷游戏开发实战—— 对象池化、性能优化与流畅控制
flutter·游戏·性能优化·openharmony·endless runner
做人不要太理性10 小时前
CANN Runtime 运行时组件深度解析:任务调度机制、存储管理策略与维测体系构建逻辑
android·运维·魔珐星云
我命由我1234510 小时前
Android 广播 - 静态注册与动态注册对广播接收器实例创建的影响
android·java·开发语言·java-ee·android studio·android-studio·android runtime
ZH154558913111 小时前
Flutter for OpenHarmony Python学习助手实战:自动化脚本开发的实现
python·学习·flutter
朗迹 - 张伟11 小时前
Tauri2 导出 Android 详细教程
android
lpruoyu12 小时前
【Android第一行代码学习笔记】Android架构_四大组件_权限_持久化_通知_异步_服务
android·笔记·学习