Flutter使用百度定位经纬度数据正常,详细地址为null

2023-11-20

Flutter使用百度定位经纬度数据正常,详细地址为null

更新至2021.09.07

一、问题:

(1)使用百度定位,插件返回的数据中经纬度有正常值,其他地址信息都为null

二、分析原因:

(1)在wifi或移动网络没有/不好的情况下,会出现地址返回null

https://blog.csdn.net/u013571833/article/details/56281899

(2)在设置为一次定位,获取到地址信息后停止定位,等下次点击时再重新开始定位时,偶尔会出现返回null的情况

androidOption.setScanspan(0); // 设置发起定位请求时间间隔

三、具体情况:

1、用百度定位提供的demo,雷电模拟器来测试

https://lbsyun.baidu.com/index.php?title=flutter/loc/download
在这里插入图片描述

2、代码

 /// 设置android端和ios端定位参数
  void _setLocOption() {
    /// android 端设置定位参数
    BaiduLocationAndroidOption androidOption = new BaiduLocationAndroidOption();
    //...安卓端设置
    androidOption.setScanspan(0); // 设置发起定位请求时间间隔(一次定位)
    
    //... ios端设置

    _locationPlugin.prepareLoc(androidMap, iosMap);
  }

 /// 启动定位  (每次点击按钮时都会触发开始定位)
  void _startLocation() {
    if (null != _locationPlugin) {
      _setLocOption();
      print('111111111111111');
      _locationPlugin.startLocation();
    }
  }
 /// 停止定位
  void _stopLocation() {
    if (null != _locationPlugin) {
      print('333333333333333333333333');
      _locationPlugin.stopLocation();
    }
  }

	//获取定位信息
	_locationListener = _locationPlugin
        .onResultCallback()
        .listen((Map<String, Object> result) {
          print('22222222222222222222222');
          print(result);
          print(result['address']);
          _stopLocation();  //在获取到数据之后停止定位
      setState(() {
        _loationResult = result;
        try {
          _baiduLocation = BaiduLocation.fromMap(result); // 将原生端返回的定位结果信息存储在定位结果类中
//          print(_baiduLocation);
        } catch (e) {
          print(e);
        }
      });
    });

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

3、模拟器配置

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

四、解决方案:

1、目前这种情况只在安卓端进行过测试,不清楚ios端是否也有同样的问题

此方案没有完全解决问题,只是做了优化。开启定时定位,在数据返回2次后获取返回给页面,手动停止定位

百度web API服务(逆地理编码) https://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad

//安卓端
//设置定时定位
androidOption.setScanspan(1000);

locationStreamSubscription =
        _locationPlugin.onResultCallback().listen((event) async{
          //监听到第2次数据返回时停止定位
          if(count >0 || !Platform.isAndroid){
            count = 0;
            if(event != null && (event['errorCode'] != null || event['errorInfo'] != null)){
              Toast.show('手机定位异常,麻烦检查一下手机系统或者应用的定位权限是否正常开启!定位错误码:${event['errorCode']}', context);
              await Future.delayed(Duration(seconds: 2));
            }else{
              if(event != null && event['latitude'] != null && event['longitude'] != null){
                //如果监听返回的详细地址为null,则通过百度webApi再次逆地址解析,但这种情况在无网络时无法请求
                if(event['address'] == null || event['address'].toString().indexOf('null')>-1){
                  try{
                  //mcode参数,这个参数里面的内容是"SHA1;包名"
                    var baiduData = await Http().fetchBaiduWepApi(
                        'http://api.map.baidu.com/reverse_geocoding/v3/?ak=xx==ak码==&output=json&coordtype=bd09ll&location=${event['latitude']},${event['longitude']}&mcode=xxxx;xxxxx',{
                      "isBaiduWepApi":true,
                    });

                    if(baiduData != null && baiduData.data != null){
                      if(baiduData.data.runtimeType == String){
                        var pageData = json.decode(baiduData.data);
                        if(pageData != null){
                          if(pageData['status'] != null && pageData['status'].toString() == '0'){
                            if(pageData['result'] != null && pageData['result']['formatted_address'] != null){
                              //todo 每个属性都要复制,其他地址信息也可能为null
                              Map<dynamic, dynamic> addressInfo = pageData['result']['addressComponent']??{};
                              event['address'] = (addressInfo['formatted_address'] != null && addressInfo['formatted_address']!='')?addressInfo['formatted_address']:event['address'];
                            }
                          }
                        }
                      }else{}
                    }
                  }on ApiError catch (e){
                    Toast.show(e.message, context);
                  }catch(e){
                    print(e);
                  }
                }
              }
              //定位第2次返回数据时,停止定位
              _locationPlugin.stopLocation();
              islocating = false;
            }
          }else{
            count = 1;
          }

    });
2021.09.07更新

在第四点中提供的解决方案,在部分安卓机上出现bug,无法将获取到定位数据返回给对应的监听函数。暂未找出引起数据返回失败的原因,现提供另一种解决方案

//定义安卓定位时可以将请求的间隔时间弄大一点,减少返回次数,减轻手机负担
 androidOption.setScanspan(1000*150);

//在监听到数据时,ios端需要立即停止
if(Platform.isIOS){         
	_locationPlugin.stopLocation();
}

//在重新触发开启定位时,先关闭定位,再重新开启定位
_locationPlugin.stopLocation();
startLocation();

//在页面dispose时在关闭定位
@override
void dispose() {     
  _locationPlugin.stopLocation();     
  super.dispose();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Flutter使用百度定位经纬度数据正常,详细地址为null 的相关文章

随机推荐

  • 平衡二叉排序树插入结点的学习总结

    最近写了平衡二叉排序树代码 在这里对自己的理解做一下总结 下面的文字 更多的是把我自己的遇到的理解上的问题和思路讲清楚 可能不能让你一下就看明白 这是我的问题 网上其实有很多写的很好的文章 我也是学他们的 然后通过写文章来考研自己是不是真的
  • Redis之坑:Redis与MySQL中事务的区别

    Redis之坑 spring data redis中的Redis事务 Redis之坑 理解Redis事务 Redis之坑 Redis与MySQL中事务的区别 Transaction之坑 数据库事务 Transaction之坑 Spring中
  • 【模型剪枝】——开源项目总结

    修剪是一种常用的压缩神经网络模型的技术 修剪方法探索模型权重 参数 中的冗余 并尝试删除 修剪冗余和非关键权重 冗余元素从模型中修剪 它们的值归零 我们确保它们不参与反向传播过程 pytorch pruning https github c
  • 设置定时任务为每天凌晨2点执行和每小时执行一次?

    每天凌晨2点 0 0 2 和每天隔一小时 0 1 例1 每隔5秒执行一次 5 例2 每隔5分执行一次 0 5 在26分 29分 33分执行一次 0 26 29 33 例3 每天半夜12点30分执行一次 0 30 0 注意日期域为0不是24
  • axure9怎么让页面上下滑动_Axure动态面板(上下左右滑动页面)

    手机端交互中 页面的上下左右滑动是常用的交互形态 今天给大家分享一下如何使用Axure来进行模拟 这里使用动态面板来实现 如果对动态面板不是很了解的同学 请查看专栏里的 动态面板入门教程 先看效果 开工之前我们我们先分析一下 滑动效果的用处
  • 利用Android Lost通过互联网或短信远程控制安卓设备

    利用Android Lost通过互联网或短信远程控制安卓设备 作者 Jack Wallen 杰克 瓦伦翻译 PurpleEndurer 2014 11 15第1版 使用智能手机要考虑的一个至关重要的因素是安全性 当然 安全问题不仅仅存在于平
  • java springboot -- MultipartFile -图片上传到远程服务器上

    新增文件 param file return private boolean saveFile MultipartFile file try 文件保存路径 String filePath A merchant 映射的地址 String fi
  • Springboot+vue+hadoop+java图书个性化推荐系统

    前台首页功能模块 3 1首页 图书个性化推荐系统 在前台首页可以查看首页 图书信息 好书推荐 留言反馈 个人中心 后台管理等内容 如图 3 2图书信息 在图书信息页面通过查看图书编号 图书名称 图书类别 图片 作者 出版社 版次 数量 点击
  • 背单词(持续更新)

    文章目录 星火雅思周计划 229 复习 考研 352 353 职场俚语 1 2 7分 1 2 3 4 5 6 7 8 haochi fun 1 2 GRE 1 2 托福 249 247 248 245 246 243 244 241 242
  • 3WebGL shader准备工具

    VSCode安装 VSCode 全称 Visual Studio Code 是一款由微软开发且跨平台的免费源代码编辑器 该软件支持语法高亮 代码自动补全 又称 IntelliSense 代码重构 查看定义功能 并且内置了命令行工具和 Git
  • Unity保存图片到相册

    Unity保存图片到Android相册 Java 纯文本查看 复制代码 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
  • ESXI 7.0 版本配置N卡显卡直通

    ESXI 7 版本配置N卡显卡直通 前因 ESXI版本太新 网上啥参考资料没有 显卡直通各种问题 虚机一装显卡驱动就直接把宿主机直接整挂了 于是各种查资料 各种尝试 终于搞定直通问题 配置 名称 版本 服务器 DELL R720 ESXI
  • MySQL中的DML、DDL、DCL到底是什么玩意呢?

    个人主页 极客小俊 作者简介 web开发者 设计师 技术分享博主 希望大家多多支持一下 我们一起进步 如果文章对你有帮助的话 欢迎评论 点赞 收藏 加关注 引言 一直以来 很多人分不清这三个东西到底是什么简称 代表什么 至在面试中遇到可能会
  • nginx的location、root、alias指令用法和区别

    亲测可用 若有疑问请私信 nginx指定文件路径有两种方式root和alias 指令的使用方法和作用域 root 语法 root path 默认值 root html 配置段 http server location if alias 语法
  • Arduino动手做(48)---三轴ADXL345模块

    37款传感器与模块的提法 在网络上广泛流传 其实Arduino能够兼容的传感器模块肯定是不止37种的 鉴于本人手头积累了一些传感器和模块 依照实践 动手试试 出真知的理念 以学习和交流为目的 这里准备逐一做做实验 不管能否成功 都会记录下来
  • 第十二届蓝桥杯 2021年省赛真题 (Java 大学C组) 第二场

    蓝桥杯 2021年省赛真题 Java 大学C组 第二场 A 浮点数 B 求余 C 双阶乘 D 格点 E 整数分解 F 3 的倍数 G 特殊年份 H 小平方 I 完全平方数 J 负载均衡 A 浮点数 题目 问题描述 IEEE 754 规定一个
  • 关于HTML基本标签及结构详解

    本文主要介绍了HTML基本标签及结构详解 本文给大家介绍的非常详细 对大家的学习或工作具有一定的参考借鉴价值 需要的朋友可以参考下 1 HTML概述 1 HTML 超文本标记语言 是一种标识性语言 非编程语言 不能使用逻辑运算 通过标签将网
  • 吴恩达 deeplearning.ai课程-卷积神经网络 (2)深度卷积模型-实例探究

    参考来源 https blog csdn net red stone1 article details 78769236 https blog csdn net koala tree article details 78531398 有关C
  • python自动化笔记(九)文件操作

    文件的打开 file open test txt w encoding utf 8 参数 文件名 访问模式 write 默认为read file write hello python 删除原有内容 并写入 ret file read 读取文
  • Flutter使用百度定位经纬度数据正常,详细地址为null

    Flutter使用百度定位经纬度数据正常 详细地址为null 更新至2021 09 07 一 问题 1 使用百度定位 插件返回的数据中经纬度有正常值 其他地址信息都为null 二 分析原因 1 在wifi或移动网络没有 不好的情况下 会出现