优秀的编程知识分享平台

网站首页 > 技术文章 正文

Flutter中定位功能的实现(flutter 定位)

nanyue 2024-08-13 07:52:17 技术文章 10 ℃


木辛老师来了,本节课咱们一起来看看如何在Flutter中使用定位功能的使用吧!

请点击右上角“关注”按钮关注我们哟:跟着木辛老师学习Flutter基础编程知识,变身快乐的编程达人吧~




来了!它来了,它来了,它朝着你奔跑着来了!

如果你想在APP中使用等位服务,那么奔向你的这篇文章就是为你而生滴!

在这里,我们将使用各种插件去尝试不同的位置示例,利用这些插件,定位服务将会非常简单易用的被使用起来。

那么,让我们开始。

当我们谈论位置服务的时候,指的是获取设备的当前位置,获取最后已知位置,获取连续的位置更新,甚至是检查位置服务是否启用或者开启。

好吧,开始讲吧!

使用Flutter Geolocator 插件尝试位置服务

通过这个插件,可以实现如下几个功能:

  1. 得到最后一次已知的位置
  2. 得到设备当前的位置
  3. 持续获得位置更新
  4. 检测一下当前设备的位置服务是否开启或者可用
  5. 计算两个地理坐标之间的距离,单位是米

接下来看看如何使用这个插件:


步骤一:安装它,通过修改pubspec.yaml文件

dependencies:
 geolocator: ^7.6.2

或者使用如下命令:

flutter pub add geolocator

步骤二:要开始使用之前需要先配置一下

需要分开设置

来看看Android吧,不过之前呢,你需要使用AndroidX模式。

不知道怎么弄?那么,请看下方↓↓↓

(1)在gradle.properties文件中增加如下内容

android.useAndroidX=true
android.enableJetifier=true


(2)确保你的android/app/build.gradle文件中的 compileSdkVersion 不低于30:

android {
 compileSdkVersion 30
 ...
}

(3)确保你已经替换了所有的针对于AndroidX的依赖。

准备就绪之后进入下一步:

添加权限!

针对Android系统,你不得不需要在AndroidManifest.xml文件中添加如下权限:

ACCESS_COARSE_LOCATION 或者 ACCESS_FINE_LOCATION

也许你要问了,这应该怎么修改呢?

那么我就真心诚意地告诉你吧:进入项目的这个目录android/app/src/main,打开一个叫做AndroidManifest.xml的文件,在<manifest>这个标签里边添加如下代码:

<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" />

咦?为啥捏?

因为是这样的,如果应用被放到了后台,你还想持续的接收到更新数据,那么,ACCESS_BACKGROUND_LOCATION在Android10系统中也许会帮助你一些,快去试试吧!也许这一条能够解决困扰你好久的问题,也说不定呢?

针对iOS系统,我们也需要稍(xue)微(wei)修改一下配置文件:进入ios/Runner目录,并且编辑 Info.plist文件,并添加如下内容:

<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>

同样的,如果在iOS系统中也想实现Android一样的功能:即使APP被放入后台还要持续接收更新数据。那么,你也需要将后台功能模式功能添加到XCode项目中。唯一需要注意的是,你需要详细地给苹果解释,你为什么要使用这项功能,否则,当你提交到AppStore的时候,苹果审核可能会给你拒绝(PS:祝你好运!)。

修改的方式类似这样:

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

好啦!开始实战吧!

接下来,通过一个简单的样例来看看如何使用这个功能。

获取当前位置

使用getCurrentPosition()这个方法,你可以非常轻松地拿到设备的当前位置,你也可以传递一些“神奇”的参数以此满足你的一些小要求。

比如:

  • desiredAccuracy:你当前的应用想要接收的数据的准确性
  • timeLimit:获取到当前位置数据最大允许的时间,超时则会抛出一个TimeOutException 并且会停止当前行为,通常情况下,如果不传递这个参数,则不会受这个限制制约(PS:当然了,同时你也会看到永远不消失的菊花)

示例代码奉上:

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()这个方法就可以呀!

看代码:

import 'package:geolocator/geolocator.dart';
StreamSubscription<Position> positionStream = Geolocator.getPositionStream(locationOptions).listen(
 (Position position) {
 print(position == null ? 'Unknown' : position.latitude.toString() + ', ' + position.longitude.toString());
});

如何手动检测权限

即使,在你开始使用的时候这个组件会自己自动地获取权限,但是保险起见,还是建议你能够同时自己动手检查一下甚至获取一下权限。

再举个例子,如果需要检查当前用户是否已经获取到了使用位置服务的权限,可以使用checkPermission()这个方法。

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


如果返回的结果告诉你,并没有成功获取到对应的权限,这个时候就需要你亲自申请了,requestPermission()开始干活啦!

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

打开配置页面

如果你希望用户修改定位的设置,就需要能够帮助他打开设置页面,如下代码则可以帮到你~

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

最后一条啦,不要着急嘛

两点之间线段最短,到底有多短呢?测量两个地理位置的距离,可以这么做:

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


行吧,说了这么多,这次的内容就到这吧,你们看了这么久记得点赞关注,并且亲自去试试代码哟。有问题可以随时和我讨论哈!


请大家关注木辛老师的课程哟,获取更多编程知识和编程技巧。接下来,木辛老师和大家一步一步地学习Flutter知识吧。

快乐编程,快乐成长!

咱们下节课再见,88~


最近发表
标签列表