【Flutter】高德地图接入Android/IOS(定位&地图)

定位

Android

参考链接

官方文档

创建应用

在这里插入图片描述
在这里插入图片描述

创建Key

在这里插入图片描述
输入Key的名称
服务平台选择Android平台
接下里获取SHA1
在这里插入图片描述
PackageName输入项目的包名
在这里插入图片描述
打开Android目录,并生成签名文件
在这里插入图片描述
如果存在签名文件,如下图
在这里插入图片描述
若没有签名文件,则需要Create New 创建新的签名文件
在这里插入图片描述
填写密码,别名、文件位置等信息
在这里插入图片描述
创建完后,会发现目录下有签名文件,可以移到app目录下
在这里插入图片描述
配置签名文件
在这里插入图片描述

    signingConfigs {
        release {
            //keystore中key的别名
            keyAlias 'key0'
            //keystore中key的密码
            keyPassword '123456'
            //keystore的文件路径,可以是绝对路径也可以是相对路径
            storeFile file('./deman_mobo.jks')
            //keystore的密码l
            storePassword '123456'
        }
    }

    buildTypes {
        release {
            // TODO: Add your own signing config for the release build.
            // Signing with the debug keys for now, so `flutter run --release` works.
            signingConfig signingConfigs.release
            minifyEnabled true //删除无用代码
            shrinkResources true //删除无用资源
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            signingConfig signingConfigs.release
            debuggable true
        }
    }

获取签名文件的SHA1
在这里插入图片描述

keytool -list -v -keystore ./gaode_key.jks

引入依赖

在这里插入图片描述

dependencies {
    implementation('com.amap.api:location:5.6.0')
}

Flutter 配置项目

在这里插入图片描述

  amap_flutter_location: ^3.0.0
  permission_handler: ^11.3.0

申明权限

在这里插入图片描述

    <!--允许访问网络,必选权限-->
    <uses-permission android:name="android.permission.INTERNET" />

    <!--允许获取精确位置,精准定位必选-->
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

    <!--允许获取粗略位置,粗略定位必选-->
    <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

    <!--允许获取设备和运营商信息,用于问题排查和网络定位(无gps情况下的定位),若需网络定位功能则必选-->
    <uses-permission android:name="android.permission.READ_PHONE_STATE" />

    <!--允许获取网络状态,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <!--允许获取wifi网络信息,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

    <!--允许获取wifi状态改变,用于网络定位(无gps情况下的定位),若需网络定位功能则必选-->
    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />

    <!--后台获取位置信息,若需后台定位则必选-->
    <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

    <!--用于申请调用A-GPS模块,卫星定位加速-->
    <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />

    <!--允许写设备缓存,用于问题排查-->
    <uses-permission android:name="android.permission.WRITE_SETTINGS" />

    <!--允许写入扩展存储,用于写入缓存定位数据-->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

    <!--允许读设备等信息,用于问题排查-->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

配置服务

<!-- 配置定位Service -->
        <service android:name="com.amap.api.location.APSService" />

在这里插入图片描述

测试代码

import 'dart:async';
import 'dart:io';

import 'package:amap_flutter_location/amap_flutter_location.dart';
import 'package:amap_flutter_location/amap_location_option.dart';
import 'package:flutter/material.dart';
import 'package:permission_handler/permission_handler.dart';

void main() {
   
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
   
  const MyApp({
   super.key});

  
  Widget build(BuildContext context) {
   
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
   
  const HomePage({
   super.key});

  
  State<HomePage> createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
   
  final AMapFlutterLocation flutterLocation = AMapFlutterLocation();
  final AMapLocationOption aMapLocationOption = AMapLocationOption(
    needAddress: true,
    geoLanguage: GeoLanguage.DEFAULT,
    onceLocation: false,
    locationMode: AMapLocationMode.Hight_Accuracy,
    locationInterval: 2000,
    pausesLocationUpdatesAutomatically: false,
    desiredAccuracy: DesiredAccuracy.Best,
    desiredLocationAccuracyAuthorizationMode:
        AMapLocationAccuracyAuthorizationMode.FullAccuracy,
    distanceFilter: -1,
  );
  late final StreamSubscription<Map<String, Object>> subscription;
  late int count = 0;

  
  void initState() {
   
    AMapFlutterLocation.updatePrivacyShow(true, true);
    AMapFlutterLocation.updatePrivacyAgree(true);
    requestPermission();
    AMapFlutterLocation.setApiKey(
      "e51a737b3742762791f3c89f4dc61e6d",
      "cb341ecb2fb63ff6965c62a009979f29",
    );
    if (Platform.isIOS) {
   
      requestAccuracyAuthorization();
    }
    subscription = flutterLocation.onLocationChanged().listen((event) {
   
      print(event.toString());
    });

    super.initState();
  }

  
  void dispose() {
   
    subscription.cancel();
    flutterLocation.destroy();
    super.dispose();
  }

  
  Widget build(BuildContext context) {
   
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            ElevatedButton(
              onPressed: () {
   
                flutterLocation.setLocationOption(aMapLocationOption);
                Timer.periodic(const Duration(seconds: 1), (timer) {
   
                  count++;
                  print("定位序列号$count");
                  flutterLocation.startLocation();
                });
              },
              child: Text("开始定位"),
            ),
            ElevatedButton(
              onPressed: () {
   
                flutterLocation.stopLocation();
              },
              child: Text("停止定位"),
            ),
          ],
        ),
      ),
    );
  }

  /// 动态申请定位权限
  void requestPermission() async {
   
    bool hasLocationWhenInUsePermission =
        await requestIosLocationWhenInUserPermission();
    if (hasLocationWhenInUsePermission) {
   
      bool hasLocationAlwaysWhenInUsePermission =
          await requestIosLocationAlwaysWhenInUserPermission();
      if (hasLocationAlwaysWhenInUsePermission) {
   
      } else {
   }
    } else {
   }
  }

  /// 申请定位权限
  Future<bool> requestLocationPermission() async {
   
    var status = await Permission.location.status;
    if (status == PermissionStatus.granted) {
   
      return true;
    } else {
   
      status = await Permission.location.request();
      if (status == PermissionStatus.granted) {
   
        return true;
      } else {
   
        return false;
      }
    }
  }

  Future<bool> requestIosLocationPermission() async {
   
    var status = await Permission.location.status;
    if (status == PermissionStatus.granted) {
   
      return true;
    } else {
   
      status = await Permission.location.request();
      if (status == 
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sheng_er_sheng

打赏是什么?好吃么

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值