• 第一百五十五回 如何获取位置信息



    我们在上一章回中介绍了如何实现滑动菜单相关的内容,本章回中将介绍 如何获取位置信息.闲话休提,让我们一起Talk Flutter吧。

    概念介绍

    我们在这里说的获取位置信息本质上是获取当前手机所在位置的gps坐标,就是我们常说的经纬度。获取位置信息属于原生平台提供的功能,Flutter做为UI框架并没有提供这种功能,因此我们需要自己编写channel,然后分别在Android和IOS平台上实现相关的代码,这样做显然又回到了原生开发中,好在Flutter提供了包机制,而且已经有三方包替我们做了这件事情,我们只需要在项目中引入并且使用三方包就可以获取到位置信息,该包的名称为:geolocator.本章回中将详细介绍它的使用方法。

    使用方法

    1. 在yaml文件中引入geolocator包,并且通过get命令获取包中的内容到项目中;
    2. 通过包中的checkPermission()方法检查是否获取到位置权限,如果没有获取到就使用requestPermission()方法获取位置权限;
    3. 使用isLocationServiceEnabled()方法检查是否已经打开位置开关,如果没有打开就使用openLocationSettings()方法打开;
    4. 使用getCurrentPosition()方法获取当前的位置信息,该信息中包含当前位置的经纬度;

    这些使用方法还有一些注意事项需要和大家说明,以免大家在使用时出现错误:

    • 我们在上面步骤中介绍的方法都是异步方法,需要配合async/await关键字来使用;
    • 打开位置开关的方法只能用于Android,IOS不支持这样的功能;

    此外,该包还提供了监听位置开关和监听位置信息的功能,它会把位置开关状态,和位置服务封装到stream中,我们获取到相应的stream后就可以使用listen()方法来监听位置开关的变化和位置信息的变化。

    示例代码

    ///获取位置开关状态,如果没有打开开关就跳转到开关设置页面(仅支持android)
    locationServiceEnabled = await Geolocator.isLocationServiceEnabled();
    if(!locationServiceEnabled) {
      debugPrint('location service is disabled');
      ///打开位置形状只适用于android,IOS不可以
      Geolocator.openLocationSettings();
      return Future.error('Location service is disabled');
    }
    
    ///检查位置权限
    permission = await Geolocator.checkPermission();
    if(permission == LocationPermission.denied || permission == LocationPermission.deniedForever) {
      permission = await Geolocator.requestPermission();
      if(permission == LocationPermission.always || permission == LocationPermission.whileInUse) {
        positionResult = await Geolocator.getCurrentPosition();
      }else {
        debugPrint('Location permission is denied');
        return Future.error('Location permission is denied');
      }
    }else {
      ///获取最近一次的位置信息和当前位置信息
       positionResult = await Geolocator.getLastKnownPosition();
       positionResult ??= await Geolocator.getCurrentPosition();
    }
    
    ///通过stream监听位置信息
    StreamSubscription<Position> serviceStatus = Geolocator.getPositionStream(
      locationSettings: locationSettings,).listen(
        (event) { debugPrint('geo updated: ${event.toString()}');},
        onDone: () => debugPrint('service updated done'),
        onError: (error) => debugPrint('service updated error: ${error.toString()}'),
    );
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    上面的代码中添加了注释,这样方便大家理解代码。在使用的时候最好把这些方法封装成独立的方法,因为需要使用aync/await关键字。我在这里就不演示程序的运行结果了,建议大家自己动手去实践,通过日志打印出获取到的位置信息。

    体验分享

    这个包的功能十分强大,除了可以提供位置信息外,还实现了位置信息的外围功能,比如检查位置权限,申请位置权限,打开位置开关。这些功能十分实用,可以极大地提高我们的开发效率。

    这个包还提供了监听位置开关状态和位置信息服务的功能,监听通过stream机制实现,这个功能是我最喜欢的功能。

    总之,这个包的功能十分强大,使用检验非常好,我推荐大家去亲自去检验一下。关于这个包的缺点,我感觉会在Android兼容性上出问题.因为Android的位置权限分前台和后面,而且还有粗略和精确之分,这些差异分散在不同的Android版本中,包中文档没有提到这些,当然也有可能该包已经兼容了各个Android版本。我没有在多个Android平台上验证,感兴趣的看官们可以自己去验证。

    看官们,与"如何获取位置信息"相关的内容就介绍到这里,欢迎大家在评论区交流与讨论!

  • 相关阅读:
    C语言 一、二维数组
    解决charles只能使用30分钟
    PathVariable、RequestParam和RequestBody
    (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
    【EMC专题】EMC测试——辐射发射测试方法
    迅为i.MX6ULL开发板nfs服务器的使用
    扩展欧几里得
    opencv 存储像素值为浮点数的图像 (.tiff)
    LeetCode 384. 打乱数组
    封装composer包
  • 原文地址:https://blog.csdn.net/talk_8/article/details/133238065