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);
}
相关推荐
叽哥27 分钟前
flutter学习第 2 节:第一个 Flutter 应用
android·flutter
2501_9160074735 分钟前
iOS 文件管理实战指南 查看 App 数据与系统日志的完整方法
android·ios·小程序·https·uni-app·iphone·webview
余辉zmh1 小时前
【MySQL基础篇】:MySQL常用内置函数以及实用示例
android·mysql·adb
惺惺作态1 小时前
Android 项目构建编译概述
android
_祝你今天愉快2 小时前
Java Lock
android·java·后端
2501_915106322 小时前
iOS 内测上架流程详解:跨平台团队如何快速部署 TestFlight
android·ios·小程序·https·uni-app·iphone·webview
Edylan3 小时前
关于Lifecycle,来讲个明白
android·架构
M0066883 小时前
低代码系统的技术深度:超越“可视化操作”的架构与实现挑战
android·rxjava
whysqwhw3 小时前
Activity 的启动模式|Flags|IntentFilter
android
whysqwhw4 小时前
安卓Hook系统服务实现插件化的核心原理
android