android - 在我使用 Fused Location Client 的 android 应用程序中,为什么使用此代码时 GPS 会过时
问题描述
我的应用程序会显示一个导航图,如果当前 GPS 位置可用,它也会显示。我在一艘沿已知路线行驶的船上进行了测试。有时会显示正确的位置。有时我会得到一个旧的 GPS 位置,即使是在要求重新读取时也是如此。有时,它似乎会卡在一个旧位置上进行多次读取。发生这种情况时,我运行了谷歌地图,它似乎清除了错误,我又开始获得一个新的位置。
// try to look at GPS....
status1 = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
if (status1 != PackageManager.PERMISSION_GRANTED)
{ requestPermissions(new String[]{Manifest.permission.ACCESS_FINE_LOCATION},10);
}
status2 = checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION);
Object cancellationToken = null;
if (status2 == PackageManager.PERMISSION_GRANTED)
fusedLocationClient.getCurrentLocation(PRIORITY_HIGH_ACCURACY, (CancellationToken) cancellationToken)
.addOnSuccessListener(this, location -> // using lambda expression...
{ if (location != null)
{ GPSLatitude = location.getLatitude();
GPSLongitude = location.getLongitude();
gotGPS = true;
//if we have a location, and it is on chart, draw the blue dot....
谷歌地图比我更擅长阅读 GPS。我是否应该考虑另一种方法。
解决方案
欢迎加入遭受谷歌之手的人的俱乐部FusedLocationProvider
,我建议您改用LocationManager
GPS 提供商。可用于在您的Activity
as中请求位置
fun getLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// do proper permissions handling
return
}
val locationManager = getSystemService(Context.LOCATION_SERVICE) as LocationManager
val gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)
if (gpsEnabled) {
// Register for location updates
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0.0f, locationListener)
// Or get last known location
val location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)
}
}
private val locationListener = LocationListener {
// Do something with the location
}
有时FusedLocationProvider
会提供不准确的位置
在某些情况下,我发现FusedLocationProvider
它相当不准确,在最近的一次体验中,与你的体验没有什么不同,我无法FusedLocationProvider
在我的应用程序中使用 GPS 锁,当我打开谷歌地图时,GPS 锁销立即出现。所以我做了一些研究,果然我发现了错误FusedLocationProvider
并最终使用了LocationManger
,至于为什么它会这样表现,我遇到的一些问题是
- 它
Fused
,意味着它使用多个来源(WiFi、网络、GPS 等),它会选择它认为合适的来源,或者混合所有来源来决定位置 FusedLocationProvider
的最大卖点是它针对电池使用进行了优化,因此只要它可以为您提供一个位置(通常准确,并非总是如此),如果它确定呼叫会给您带来不必要的负载,它就不会撞到硬件电池- 它似乎也在进行位置缓存,这可能是位置修复过时的原因,在这个问题的评论中,用户分享了他们对这种情况的经验
一些问题引起的链接FusedLocationProvider
如何FusedLocationProvider
影响早期使用的数据收集应用程序的位置准确性LocationManger
FusedLocationProvider
由于缓存而导致问题
推荐阅读
- beautifulsoup - 如何使用 beautifulsoup 找到特定标签的值(可以是任何值)?
- python - 在 Pandas 中循环查找不是 NaN 的值
- python - “完美阶乘”python 程序
- r - 聚合和汇总数据框中的行
- python - 我试图将我的 Django/python 项目部署到 heroku.com
- gradle - 在 Netbeans 12 中打开 Gradle 项目
- python-3.x - PyQt5 窗口在终止线程时冻结
- delphi - 服务应用程序中的 DpiAware
- c# - 调整网格内的图像大小 - WPF
- java - 不能为同一方面类的方法设置建议