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);
}
相关推荐
还是奇怪2 小时前
Linux - 安全排查 3
android·linux·安全
Android采码蜂2 小时前
BLASTBufferQueue03-BufferQueueConsumer核心操作
android
Android采码蜂3 小时前
BLASTBufferQueue02-BufferQueueProducer核心操作
android
2501_915921433 小时前
没有Mac如何完成iOS 上架:iOS App 上架App Store流程
android·ios·小程序·https·uni-app·iphone·webview
码农明明4 小时前
Google Play 应用上架二三事
android·google
红橙Darren7 小时前
手写操作系统 - 环境搭建
android·微信·操作系统
_一条咸鱼_7 小时前
Android Runtime直接内存管理原理深度剖析(73)
android·面试·android jetpack
你听得到117 小时前
揭秘Flutter图片编辑器核心技术:从状态驱动架构到高保真图像处理
android·前端·flutter
xiaoyan20159 小时前
最新Flutter3.32+Dart3仿微信App聊天实例
前端·flutter·dart