木辛老师来了,本节课咱们一起来看看如何在Flutter中使用定位功能的使用吧!
请点击右上角“关注”按钮关注我们哟:跟着木辛老师学习Flutter基础编程知识,变身快乐的编程达人吧~
来了!它来了,它来了,它朝着你奔跑着来了!
如果你想在APP中使用等位服务,那么奔向你的这篇文章就是为你而生滴!
在这里,我们将使用各种插件去尝试不同的位置示例,利用这些插件,定位服务将会非常简单易用的被使用起来。
那么,让我们开始。
当我们谈论位置服务的时候,指的是获取设备的当前位置,获取最后已知位置,获取连续的位置更新,甚至是检查位置服务是否启用或者开启。
好吧,开始讲吧!
使用Flutter Geolocator 插件尝试位置服务
通过这个插件,可以实现如下几个功能:
- 得到最后一次已知的位置
- 得到设备当前的位置
- 持续获得位置更新
- 检测一下当前设备的位置服务是否开启或者可用
- 计算两个地理坐标之间的距离,单位是米
接下来看看如何使用这个插件:
步骤一:安装它,通过修改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~