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);
}
相关推荐
2501_932750261 小时前
Android 自定义 View 入门
android
事圆则缓3 小时前
Android 开启线程的几种方式:Thread、线程池、HandlerThread 与协程
android
m0_738185825 小时前
Flutter 鸿蒙化实战:flutter_iot_wifi 适配 OpenHarmony,IoT 设备 WiFi 配网
物联网·flutter·华为·harmonyos·鸿蒙
半摆烂日常18 小时前
低代码平台API对接实践:接口鉴权与数据同步的完整实现
android·低代码·rxjava
事圆则缓18 小时前
volatile 使用场景全解析:它能保证什么,又解决不了什么
android
蒲公英内测分发19 小时前
智能投影仪参加海外展会,未上架的 Android 配套 App 怎么让客户限时试用?
android
ii_best19 小时前
按键精灵手机端开发安卓版实战:手写一个可最小化、可拖动的「运行日志悬浮窗」(附完整 源码 + 踩坑记录)
android·ios·智能手机·自动化·ai编程·按键精灵
终端安全笔记19 小时前
安卓做 MDM 管控,先分清三种注册入口
android·安全·智能手机
乌萨达20 小时前
手机模拟器安卓怎么用?电脑安装应用、玩手游与账号同步指南
android·智能手机·电脑·雷电模拟器
美狐美颜SDK开放平台21 小时前
Android与iOS直播APP美颜有什么区别?视频美颜SDK开发详解
android·ios·音视频·视频美颜sdk