flutter获取地理定位:geolocator依赖详细用法

 本文使用geolocator插件实现app物理定位功能。

该插件的主要功能有:

  • 获取最后已知位置;
  • 获取设备当前位置;
  • 获取连续的位置更新;
  • 检查设备是否启用了定位服务;
  • 计算两个地理坐标之间的距离(米);
  • 计算两个地理坐标之间的方位;

如何安装:

 方法一:在pubspec.yaml文件中添加它,10.1.0是当前最新版本号,也可指定特定版本号。

然后在终端运行以下命令:

flutter packages get

方法二:直接在终端运行以下命令获取最新版本geolocator插件

flutter pub add geolocator

配置app环境 :

Android系统

1.在 "android\gradle.properties" 文件中添加以下内容:

android.useAndroidX=true
android.enableJetifier=true

2.确保将 "android/app/build.gradle "文件中的 compileSdkVersion 设置为 33(10.1.0版本时要求,不同版本可能要求不一样,具体看原依赖文档):

android {compileSdkVersion 33...
}

3.确保将所有 android. 依赖项替换为 AndroidX 对应项(完整列表可在此处找到:迁移到 AndroidX)。

4.打开 "android\app\src\main\AndroidManifest.xml" 文件,将以下两行中的一行添加为<manifest> 标签的直接子代(当这两种权限都配置时,geolocator将使用 ACCESS_FINE_LOCATION):

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

如果你目标用户用的是Android10或者以上的系统,就需要再添加ACCESS_BACKGROUND_LOCATION这条权限

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

IOS系统

打开 "ios\Runner\Info.plist" 文件,添加以下内容。string标签内为描述,可更改以贴合上下文。

<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs access to location when open.</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>This app needs access to location when in the background.</string>

如果你想在应用程序处于后台时也能接收位置更新,你还需要在 XCode 项目中添加后台模式功能(项目 > 签名和功能 > "+ 功能 "按钮)并选择位置更新。(但要注意,在向 AppStore 提交应用程序时,你需要向苹果公司详细解释为什么您的应用程序需要这样做。如果苹果不满意您的解释,您的应用程序将被拒绝。)

使用 requestTemporaryFullAccuracy({purposeKey: "YourPurposeKey"}) 方法时,应在 Info.plist 文件中添加一个字典。第二个键(本例中称为 YourPurposeKey)应与 requestTemporaryFullAccuracy() 方法中传递的 purposeKey 相匹配

<key>NSLocationTemporaryUsageDescriptionDictionary</key>
<dict><key>YourPurposeKey</key><string>The example App requires temporary access to the device&apos;s precise location.</string>
</dict>

简单使用举例:

权限配置完成后我们就可以开始使用地理定位依赖了,下面的代码举例说明了如何获取设备的当前位置,包括检查定位服务是否启用,以及检查/请求访问设备位置的权限:

/// 位置服务Future _determinePosition() async {bool serviceEnabled;LocationPermission permission;double longitude=0;double latitude=0;try {/// 手机GPS服务是否已启用。serviceEnabled = await Geolocator.isLocationServiceEnabled();if (!serviceEnabled) {//定位服务未启用,要求用户启用定位服务var res = await Geolocator.openLocationSettings();if (!res) {/// 被拒绝return;}}/// 是否允许app访问地理位置permission = await Geolocator.checkPermission();if (permission == LocationPermission.denied) {/// 之前访问设备位置的权限被拒绝,重新申请权限permission = await Geolocator.requestPermission();if (permission == LocationPermission.denied || permission == LocationPermission.deniedForever) {/// 再次被拒绝。根据Android指南,你的应用现在应该显示一个解释性UI。return;}} else if (permission == LocationPermission.deniedForever) {/// 之前权限被永久拒绝,打开app权限设置页面await Geolocator.openAppSettings();return;}/// 允许访问地理位置,获取地理位置Position position = await Geolocator.getCurrentPosition();longitude = position.longitude;latitude = position.latitude;} catch (e) {print(e);}}

geolocator依赖的完整API:

 检查GPS是否启用:isLocationServiceEnabled

可用该方法检查手机GPS(全球定位系统)是否打开,以此进行不同操作

import 'package:geolocator/geolocator.dart';bool isLocationServiceEnabled  = await Geolocator.isLocationServiceEnabled();

然后可以调用 getServiceStatusStream监听服务状态变化。这将返回一个可以监听的 Stream<ServiceStatus>,以接收位置服务状态更新。

import 'package:geolocator/geolocator.dart';StreamSubscription<ServiceStatus> serviceStatusStream = Geolocator.getServiceStatusStream().listen((ServiceStatus status) {print(status);});

 检查是否允许APP获取位置权限:checkPermission

import 'package:geolocator/geolocator.dart';LocationPermission permission = await Geolocator.checkPermission();

 APP请求获取位置权限:requestPermission

import 'package:geolocator/geolocator.dart';LocationPermission permission = await Geolocator.requestPermission();

checkPermission 和 requestPermission 方法返回值说明

  • denied:用户拒绝了访问设备位置的权限。您可以再次申请权限(这也是初始权限状态)。
  • deniedForever:永久拒绝访问设备位置的权限。请求权限时,权限对话框将不会显示,直到用户在应用程序设置中更新权限。
  • whileInUse:仅当应用程序正在使用时才允许访问设备位置。
  • always:即使应用程序在后台运行,也允许访问设备位置。

打开相关设置页面:

在某些情况下,有必要询问用户并更新其设备设置。例如,用户最初永久拒绝了APP访问设备位置的权限,或者位置服务未启用(在 Android 上,自动解析不起作用)。在这种情况下,你可以使用 openAppSettingsopenLocationSettings 方法立即将用户重定向到设备的设置页面。 

安卓系统中,openAppSettings 方法将把用户重定向到应用程序特定设置,用户可以在此重新设置APP相关权限。

openLocationSettings 方法将弹窗询问或把用户重定向到设备位置设置,用户可在此启用/禁用位置服务。


iOS 系统中,我们不允许打开特定的设置页面,因此这两种方法都会将用户重定向到 "设置应用",用户可以从该应用导航到正确的设置类别,以更新权限或启用/禁用位置服务。

import 'package:geolocator/geolocator.dart';await Geolocator.openAppSettings();
await Geolocator.openLocationSettings();

获取当前位置:getCurrentPosition

  • desiredAccuracy:app希望接收的位置数据的精度(可选值在文章结尾有说明);
  • timeLimit:获取当前位置所允许的最长时间。超过时间限制后,将抛出 TimeOutException 异常,并取消调用。默认情况下未配置任何限制,即永不超时。
import 'package:geolocator/geolocator.dart';Position position = await Geolocator.getCurrentPosition(desiredAccuracy: LocationAccuracy.high);

获取最后已知位置:getLastKnownPosition

import 'package:geolocator/geolocator.dart';Position? position = await Geolocator.getLastKnownPosition();

监听持续性的位置变化:getPositionStream

  • accuracy:应用程序希望接收的位置数据的精确度;
  • distanceFilter:在生成更新事件之前,设备水平移动的最小距离(以米为单位);
  • timeLimit:位置更新之间允许的最长间隔时间。超过时限后,将抛出 TimeOutException 异常,并取消数据流。默认情况下未配置任何限制,即永不超时。
import 'package:geolocator/geolocator.dart';final LocationSettings locationSettings = LocationSettings(accuracy: LocationAccuracy.high,distanceFilter: 100,
);
StreamSubscription<Position> positionStream = Geolocator.getPositionStream(locationSettings: locationSettings).listen((Position? position) {print(position == null ? 'Unknown' : '${position.latitude.toString()}, ${position.longitude.toString()}');});

在某些情况下,有必要指定一些平台特定的设置。这可以通过使用特定平台的 AndroidSettings 或 AppleSettings 类来实现。使用特定平台类时,还必须导入特定平台包。示例:

import 'package:geolocator/geolocator.dart';
import 'package:geolocator_apple/geolocator_apple.dart';
import 'package:geolocator_android/geolocator_android.dart';late LocationSettings locationSettings;if (defaultTargetPlatform == TargetPlatform.android) {locationSettings = AndroidSettings(accuracy: LocationAccuracy.high,distanceFilter: 100,forceLocationManager: true,intervalDuration: const Duration(seconds: 10),//(可选)设置前台通知配置,使应用程序在进入后台时保持活跃foregroundNotificationConfig: const ForegroundNotificationConfig(notificationText:"Example app will continue to receive your location even when you aren't using it",notificationTitle: "Running in Background",enableWakeLock: true,));
} else if (defaultTargetPlatform == TargetPlatform.iOS || defaultTargetPlatform == TargetPlatform.macOS) {locationSettings = AppleSettings(accuracy: LocationAccuracy.high,activityType: ActivityType.fitness,distanceFilter: 100,pauseLocationUpdatesAutomatically: true,// 只有当我们的APP在后台启动时才设置为trueshowBackgroundLocationIndicator: false,);
} else {locationSettings = LocationSettings(accuracy: LocationAccuracy.high,distanceFilter: 100,);
}StreamSubscription<Position> positionStream = Geolocator.getPositionStream(locationSettings: locationSettings).listen((Position? position) {print(position == null ? 'Unknown' : '${position.latitude.toString()}, ${position.longitude.toString()}');});

 计算两个坐标间的距离:distanceBetween

  • startLatitude:起始位置的经度。
  • startLongitude:起始位置的纬度。
  • endLatitude:终点位置的经度。
  • endLongitude:终点位置的维度。
import 'package:geolocator/geolocator.dart';double distanceInMeters = Geolocator.distanceBetween(52.2165157, 6.9437819, 52.3546274, 4.8285838);

 计算两个坐标间的方位:bearingBetween

同样需要上述四个参数。

import 'package:geolocator/geolocator.dart';double bearing = Geolocator.bearingBetween(52.2165157, 6.9437819, 52.3546274, 4.8285838);

定位精度枚举值

Android

  • lowest:确保不会使用额外的功率来计算位置。这意味着该请求将充当被动监听器,只接收代表其他客户端计算的 "空闲 "位置,而不会只代表该请求计算位置。(可能不会返回任何位置信息)
  • low:以可能牺牲定位精度为代价,对低功耗进行权衡。
  • medium:要求在定位精度和耗电量之间进行权衡。
  • high:要求权衡高精度定位和可能的额外耗电量。

IOS  请求的数据越详细,对电池消耗的影响就越大。

  • lowest:精确到最近的三公里。
  • low:精确到最近的一公里。
  • medium:精度精确到一百米以内。
  • high:精确到距离所需目标十米以内。
  • best:可用的最佳精度级别。
  • bestForNavigation:使用附加传感器数据以方便导航应用程序的最高精度。

好了,去玩吧 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/244105.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python基础第九篇(Python可视化的开发)

文章目录 一、json数据格式&#xff08;1&#xff09;.转换案例代码&#xff08;2&#xff09;.读出结果 二、pyecharts模块介绍三、pyecharts模块入门&#xff08;1&#xff09;.pyecharts模块安装&#xff08;2&#xff09;.pyecharts模块操作&#xff08;1&#xff09;.代码…

UE5 - Polycam扫描文件导入插件

Polycam是利用Gaussian Splatting进行3D重建的3D扫描相关软件&#xff0c;其对应有UE引擎的插件&#xff08;Plugin_XV3dGS&#xff09;可以把相关格式的文件导入到引擎&#xff1b; 首先Polycam的官网为&#xff1a;My Captures | Polycam 可以下载各种用户扫描文件&#xff…

第二证券:大金融板块逆势护盘 北向资金尾盘加速净流入

周一&#xff0c;A股商场低开低走&#xff0c;沪指收盘失守2800点。截至收盘&#xff0c;上证综指跌2.68%&#xff0c;报2756.34点&#xff1b;深证成指跌3.5%&#xff0c;报8479.55点&#xff1b;创业板指跌2.83%&#xff0c;报1666.88点。沪深两市合计成交额7941亿元&#xf…

Django代码中的TypeError ‘float‘ object is not callable

学习使用Django进行网页爬取取决于你对Python、Django框架和网络爬虫的熟悉程度。以下是一些关键点&#xff0c;总的来说&#xff0c;如果你已经具备Python和Django的基础知识&#xff0c;并对网页爬虫有一定了解&#xff0c;那么学习使用Django进行网页爬取将会比较容易。如果…

鸿蒙应用开发学习:获取手机位置信息

一、前言 移动应用中经常需要获取设备的位置信息&#xff0c;因此在鸿蒙应用开发学习中&#xff0c;如何获取手机的位置信息是必修课。之前我想偷懒从别人那里复制黏贴代码&#xff0c;于是在百度上搜了一下&#xff0c;可能是我输入的关键字不对&#xff0c;结果没有找到想要…

Bluetooth Device Address(BD_ADDR) - 2

蓝牙核心规范&#xff1a;Core v5.3中关于蓝牙地址的其他说明 Vol 3: Host, Part C: Generic Access Profile 3 User interface aspects 3.2 Representation of Bluetooth parameters 3.2.1 Bluetooth Device Address (BD_ADDR) BD_ADDR 是蓝牙设备使用的地址。在设备发现过…

Docker容器操作 Docker创建并运行Nginx、Redis

容器操作的命令如图&#xff1a; 容器命令 # 创建并运行一个容器&#xff0c;运行成功后会返回容器id docker run# 暂停&#xff0c;将容器挂起&#xff0c;内存暂存&#xff0c;CPU不再执行 docker pause # 恢复运行&#xff0c;内存恢复&#xff0c;CPU恢复 docker unpause#…

设计模式篇章(4)——十一种行为型模式

这个设计模式主要思考的是如何分配对象的职责和将对象之间相互协作完成单个对象无法完成的任务&#xff0c;这个与结构型模式有点像&#xff0c;结构型可以理解为静态的组合&#xff0c;例如将不同的组件拼起来成为一个更大的组件&#xff1b;而行为型更是一种动态或者具有某个…

微信小程序实现长按 识别图片二维码

第一种方案&#xff08;只需要在image里面加一个属性就可以了&#xff09; show-menu-by-longpress“{{true}}” <image show-menu-by-longpress"{{true}}" src"{{sysset.dyqewm}}" />第二种方案 放大预览图片&#xff0c;长按识别二维码 wxml <…

ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>=5.12

一、错误描述 ImportError: The Qt version imported is 5.9.7 but Matplotlib requires Qt>5.12 在用python中的plt包进行绘图时对plt进行了更新&#xff0c;更新之后再运行以前的代码就出现了这个问题。 二、bug消除 &#xff08;一&#xff09;解决方法——升级pyqt包…

【4k】4k的webrtc播放示例

目录 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数 使用带研发角色的账号&#xff0c;在app端设置下分辨率 &#xff1a; 4k 点播 ffplay播放看下详细的参数

关于在微信小程序中使用taro + react-hook后销毁函数无法执行的问题

问题&#xff1a; 在 taro中使用navigageTo() 跳转路由后hook中useEffect 的return函数没有执行 没有执行return函数 框架版本&#xff1a; tarojs: 3.6 react: 18.0 原因&#xff1a; 使用navigateTo() 跳转路由的话并不会销毁页面和组件&#xff0c;会加入一…

2023年第十四届蓝桥杯软件赛省赛总评

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周。 在QQ群上交流答疑&am…

Portainer Docker容器可视化管理平台实践

Portainer Docker容器可视化管理平台实践 引安装登录Remote ENV 实践 引 平常用docker命令操作比较多&#xff0c;找了一款docker可视化工具&#xff0c;方便快速预览和批量操作&#xff0c;不想一行一行敲的时候&#xff0c;可以偷偷懒。Portainer试用了一下&#xff0c;安装…

二分法——C++

二分分为整数二分和浮点数二分&#xff0c;其中比较复杂的是整数二分&#xff0c;简单一点的是浮点数二分。 我们首先来说明整数二分,主要来讲解模板。 整数二分&#xff1a; 我们先来说一说使用二分法的前提&#xff0c;要有单调性&#xff0c;然后可以根据某种性质来划分成…

C#winform上位机开发学习笔记5-串口助手的定时发送功能添加

1.功能描述 选择自动发送功能后&#xff0c;按照设定的发送时间发送发送框中的信息数据&#xff0c;设定时间可以手动输入&#xff0c;当手动输入信息无效&#xff08;非数字&#xff09;时&#xff0c;系统弹出错误提示&#xff0c;并将其设置为默认定时时间。 2.代码部分 步…

不同知识表示方法与知识图谱

目录 前言1 一阶谓词逻辑1.1 简介1.2 优势1.3 局限性 2 产生式规则2.1 简介2.2 优势2.3 局限性 3 框架系统3.1 简介3.2 优势3.3 局限性 4 描述逻辑4.1 简介4.2 优势4.3 局限性 5 语义网络5.1 简介5.2 优势5.3 局限性 结语 前言 知识表示是人工智能领域中至关重要的一环&#x…

基于SpringBoot Vue博物馆管理系统

大家好✌&#xff01;我是Dwzun。很高兴你能来阅读我&#xff0c;我会陆续更新Java后端、前端、数据库、项目案例等相关知识点总结&#xff0c;还为大家分享优质的实战项目&#xff0c;本人在Java项目开发领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#x…

TCP和SSL/TLS 协议通信原理

&#x1f47d;System.out.println(“&#x1f44b;&#x1f3fc;嗨&#xff0c;大家好&#xff0c;我是代码不会敲的小符&#xff0c;双非大四&#xff0c;Java实习中…”); &#x1f4da;System.out.println(“&#x1f388;如果文章中有错误的地方&#xff0c;恳请大家指正&a…

windows 11安装VMware 17 ,VMware安装Ubuntu 20.4

一、下载安装激活VMware 17 下载与激活&#xff1a;Vmware 17 下载地址、最新激活码 2024 _ 注意&#xff1a;安装路径自己选择&#xff0c;路径中尽可能避免中文或空格 二、下载Ubuntu 镜像 下载镜像地址&#xff1a;清华大学开源软件镜像站 点开下载镜像地址&#xff0c;找…