android - Android在按钮按下时获取高分辨率位置信息
问题描述
我已经阅读了 Android Docs,FusedLocationProvider
vs LocationManager
; 在stackoverflow中仔细阅读了围绕这个主题的一系列令人眼花缭乱的问题和答案;并开发了许多迄今为止结果不佳的测试。为什么这该死的令人困惑和难以理解?
当用户在应用程序中执行操作时,我有一个应用程序需要获取高分辨率位置对象(lat/long/alt/accuracy/etc);假设他们按下了一个按钮。做这个的最好方式是什么?
我已经使用fusedLocationProviderClient.getLastLocation().addOnSuccessListener()
并得到了非常复杂的结果。
我用过locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
。如果我在我的 Galaxy S9 上启动 GPS 状态应用程序,那么这会产生非常好的结果。但如果没有运行,那么结果就毫无价值。
我在这里想念什么?每个人都喜欢指向这个 Doc 站点或那个 Example 站点,它们大多毫无价值,也没有真正回答这个特定的问题。我已经浪费了几个小时在那些根本不回答这个问题的网站上。请总结一下这里应该使用的一般算法和调用。这就是我所需要的。
我希望能够在我的院子里走来走去(这里和那里 10 米)并按下按钮并让应用程序显示纬度/经度/准确度/高度/距上一个位置的距离,并且每次都正确在一定的精度范围内。我需要做什么?我需要高分辨率精度,但能够通知用户精度低于 100 英尺,即使误差为 400 英尺,仍能获得最佳精度。
解决方案
您错过了 GPS 接收器的工作方式。
当没有应用程序使用精确位置时,所有智能手机都会关闭 GPS 接收器以节省电池电量。
即使您选择启用位置服务(在设置中),您也会注意到通知栏中的 GPS 使用图标仅在应用程序处于活动状态时出现,例如 Google 地图或 GPS 测试应用程序。
一旦接收器打开(因为某些应用程序需要它),“修复”需要一些时间 - 可以使用准确的位置测量。
修复需要多长时间取决于几件事,包括环境条件、您的手机类型、自上次准确修复以来的时间和距离等。
它可能需要几秒钟到几分钟的时间。
因此,您应该做的是,在您的应用程序打开后立即订阅位置信息,并尽可能频繁地请求接收它。
然后,只有在您有良好的准确性时才启用该按钮,并在按下该按钮时显示最新结果。
您可能还应该在等待准确修复时向用户显示一些微调器或消息,以便用户知道您的应用程序没有卡住。
编辑:“订阅”是指注册必要的回调,以便您的应用程序在准备好时从系统接收位置。
如何做到这一点,取决于您选择的 API。
谷歌文档中没有错误。如果您选择使用融合位置,则需要执行以下操作:
创建一个位置请求对象并将优先级设置为
PRIORITY_HIGH_ACCURACY
、setInterval
和setFastestInterval
1000(1 秒)以获得最佳精度。从中获取
FusedLocationProviderClient
对象LocationServices
使用客户端向您的应用注册回调
这里有代码示例: https ://developer.android.com/training/location/request-updates
在您的应用程序的回调函数中,您可以检查准确性,如果它足够好,您可以启用按钮并保存位置,以便在用户单击按钮时将其显示给用户。
推荐阅读
- java - Spring MongoDB:服务器在启动后立即关闭连接
- python-3.x - 在......中找不到“adb.exe”?
- mysql - MYSQL请求显示两个表的行的差异并删除考虑到行ID的重复字段
- hibernate - Spring JPA - 两种方式映射急切地获取孩子
- c# - 如何将此 PowerShell 代码转换为 C#
- c++ - 在点云项目中找不到 std::sample
- java - 从 Json 到 Java Object 的转换,int 变量默认赋值为 0,如果没有传入 JSON
- visual-studio-code - Visual Studio代码,如何复制文件名
- javascript - JavaScript SyntaxError:输入意外结束
- python - 从 DataLoader 图像中基于 Pytorch 参数裁剪自定义子图像