Flutter使用百度地图接口实现地图功能

使用百度地图API实现地图功能

  1. 首先配置安卓的环境,创建好项目后用Android studio打开android项目
    在这里插入图片描述

  2. 打开之后创建一个新的Application,继承百度的BmfMapApplication类

package com.example.baidumap;
import com.baidu.mapapi.base.BmfMapApplication;

public class MyApplication extends BmfMapApplication{
    public void onCreate(){
        super.onCreate();
    }
}

在这里插入图片描述

  1. 修改AndroidManifest
    在这里插入图片描述
    在这里插入图片描述
    涂掉的地方是自己申请的百度AK
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.baidumap">
    <!-- io.flutter.app.FlutterApplication is an android.app.Application that
         calls FlutterMain.startInitialization(this); in its onCreate method.
         In most cases you can leave this as-is, but you if you want to provide
         additional functionality it is fine to subclass or reimplement
         FlutterApplication and put your custom class here. -->
    <application
        android:name="MyApplication"
        android:label="baidumap"
        android:icon="@mipmap/ic_launcher">
        <activity
            android:name=".MainActivity"
            android:launchMode="singleTop"
            android:theme="@style/LaunchTheme"
            android:configChanges="orientation|keyboardHidden|keyboard|screenSize|smallestScreenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
            android:hardwareAccelerated="true"
            android:windowSoftInputMode="adjustResize">
            <!-- Specifies an Android theme to apply to this Activity as soon as
                 the Android process has started. This theme is visible to the user
                 while the Flutter UI initializes. After that, this theme continues
                 to determine the Window background behind the Flutter UI. -->
            <meta-data
              android:name="io.flutter.embedding.android.NormalTheme"
              android:resource="@style/NormalTheme"
              />
            <!-- Displays an Android View that continues showing the launch screen
                 Drawable until Flutter paints its first frame, then this splash
                 screen fades out. A splash screen is useful to avoid any visual
                 gap between the end of Android's launch screen and the painting of
                 Flutter's first frame. -->
            <meta-data
              android:name="io.flutter.embedding.android.SplashScreenDrawable"
              android:resource="@drawable/launch_background"
              />
            <meta-data
                android:name="com.baidu.lbsapi.API_KEY"
                android:value="自己申请的百度AK"
                />
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <!-- Don't delete the meta-data below.
             This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
        <meta-data
            android:name="flutterEmbedding"
            android:value="2" />
    </application>
</manifest>
  1. 打开android 目录app下的build.gradle文件,在release代码块中添加如下内容。(默认情况下 flutter不会开启 Android 的混 淆)
proguardFiles getDefaultProguardFile('proguard-android.txt'), 
'proguard-rules.pro'

在这里插入图片描述
5. 创建 /android/app/proguard-rules.pro 文件
在这里插入图片描述
6. 编写混淆文件,打开proguard-rules.pro文件,添加如下代码。

-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-keep class com.baidu.vi.** {*;}
-dontwarn com.baidu.**
  1. 创建百度地图显示组件
import 'package:flutter/material.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'package:flutter_baidu_mapapi_map/flutter_baidu_mapapi_map.dart';
class BaiduMap extends StatefulWidget {
  BMFMapOptions mapOptions = BMFMapOptions(
      center: BMFCoordinate(39.917215, 116.380341),
      zoomLevel: 12,
      mapPadding: BMFEdgeInsets(left: 30, top: 0, right: 30, bottom: 0));
  @override
  _BaiduMapState createState() => _BaiduMapState();
}

class _BaiduMapState extends State<BaiduMap> {
  BMFMapOptions mapOptions = BMFMapOptions(
      center: BMFCoordinate(39.917215, 116.380341),
      zoomLevel: 12,
      mapPadding: BMFEdgeInsets(left: 30, top: 0, right: 30, bottom: 0));
  @override
  Widget build(BuildContext context) {
    return Container(
      child: BMFMapWidget(
        onBMFMapCreated: (controller) {
          onBMFMapCreated(controller);
        },
        mapOptions: mapOptions,
      ),
    );
  }

  void onBMFMapCreated(BMFMapController controller) {}
}
  1. 创建main函数
import 'package:baidumap/baidu_map.dart';
import 'package:flutter/material.dart';
import 'package:flutter_baidu_mapapi_base/flutter_baidu_mapapi_base.dart';
import 'dart:io';
void main() {
  if(Platform.isIOS){
    BMFMapSDK.setApiKeyAndCoordType(
        '自己申请的百度AK', BMF_COORD_TYPE.BD09LL);
  }else if(Platform.isAndroid){
    BMFMapSDK.setCoordType(BMF_COORD_TYPE.BD09LL);}
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      home: BaiduMap(),
    );
  }
}

在这里插入图片描述

实现类似微信发送定位的功能,你需要使用百度地图提供的 SDK。在 Flutter 中,你可以使用 `flutter_baidu_mapapi_sdk` 插件来使用百度地图 SDK。 下面是实现类似微信发送定位的步骤: 1. 引入插件 在 `pubspec.yaml` 文件中添加 `flutter_baidu_mapapi_sdk` 插件依赖: ```yaml dependencies: flutter_baidu_mapapi_sdk: ^latest_version ``` 2. 初始化地图 在需要使用地图的页面中初始化地图,可以使用 `BaiduMapController` 控制地图: ```dart import 'package:flutter_baidu_mapapi_sdk/flutter_baidu_mapapi_sdk.dart'; class MapPage extends StatefulWidget { @override _MapPageState createState() => _MapPageState(); } class _MapPageState extends State<MapPage> { BaiduMapController _controller; @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ BaiduMap( onMapCreated: (controller) { _controller = controller; }, initialCameraPosition: CameraPosition( target: LatLng(39.915, 116.404), zoom: 11, ), ), ], ), ); } } ``` 3. 添加定位按钮 在页面中添加一个定位按钮,当用户点击按钮时,获取当前位置信息并显示在地图上: ```dart import 'package:location/location.dart'; class _MapPageState extends State<MapPage> { ... final _location = Location(); void _getCurrentLocation() async { final locationData = await _location.getLocation(); final latLng = LatLng(locationData.latitude, locationData.longitude); _controller.animateCamera(CameraUpdate.newLatLng(latLng)); _controller.addMarker(MarkerOptions( position: latLng, icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), )); } @override Widget build(BuildContext context) { return Scaffold( body: Stack( children: [ BaiduMap( onMapCreated: (controller) { _controller = controller; }, initialCameraPosition: CameraPosition( target: LatLng(39.915, 116.404), zoom: 11, ), ), Positioned( bottom: 16, right: 16, child: FloatingActionButton( onPressed: _getCurrentLocation, child: Icon(Icons.location_on), ), ), ], ), ); } } ``` 4. 获取地址信息 通过百度地图提供的 `ReverseGeoCodeSearch` 类,可以根据经纬度获取地址信息: ```dart import 'package:flutter_baidu_mapapi_sdk/flutter_baidu_mapapi_sdk.dart'; class _MapPageState extends State<MapPage> { ... final _location = Location(); final _search = ReverseGeoCodeSearch(); void _getCurrentLocation() async { final locationData = await _location.getLocation(); final latLng = LatLng(locationData.latitude, locationData.longitude); _controller.animateCamera(CameraUpdate.newLatLng(latLng)); _controller.addMarker(MarkerOptions( position: latLng, icon: BitmapDescriptor.defaultMarkerWithHue(BitmapDescriptor.hueRed), )); _search.reverseGeoCode( ReverseGeoCodeOption( location: latLng, ), onGetReverseGeoCodeResult: (result) { final address = result.address; print(address); }, ); } ... } ``` 5. 发送位置信息 最后,你可以通过你的应用程序向服务器发送位置信息,实现类似微信发送位置的功能。 以上就是实现类似微信发送定位的步骤,你可以根据你的具体需求进行修改。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值