5

我只有一台设备 (HTC HD Deside) 用于测试我的应用程序以及何时获取 GPS 数据

locationManager.requestLocationUpdate(criteria,0,0,this); //critera = "gps"

我的 GPS 图标出现在通知栏中,但它“闪烁”,好像这意味着我的设备正在寻找并获取 GPS 数据。因此,我的应用程序在成功从 GPS 获取数据之前花费了太多的“思考”时间(~100 万到 300 万!)(在图标停止闪烁之前)

所以,我有义务像这样创建一个 while 指令:

do{
    lastLocation = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
}while(System.currentTimeMillis() - lastLocation.getTime() > 5000);

谢谢,我肯定会得到一个最近的位置,但我浪费了太多时间。

有什么问题?是硬件吗?我能找到更好的方法来解决这个问题吗?我可以“快速”获得 GPS 数据吗?:/ (1~5 秒)

4

4 回答 4

3

我认为您应该在开发位置感知应用程序之前阅读此http://developer.android.com/guide/topics/location/strategies.html指南。

GPS 传感器需要 1 到 3 分钟才能得到修复,您无法快速修复(您想要 1-5 秒)。

您应该使用最后一个已知位置值并开始请求位置修复。当您拥有一个时,您会相应地刷新您的内容。

于 2013-03-10T23:35:46.153 回答
1

当您在建筑物或覆盖区域内时,GPS 传感器可能需要更多时间。有时,如果您在建筑物内并且没有可用的 GPS 信号,它总是会闪烁并消耗大量电池电量。尝试使用其他一些提供商。

于 2013-03-11T03:43:00.960 回答
0

您是否连接到数据网络?

我不了解 HTC,但通常当数据连接可用时,该设备使用称为辅助 GPS 的东西。卫星星历是从服务器下载的,而不是扫描地平线上的所有可见卫星,修复所需的时间为 10-20 秒。

您也可能在室内或信号低的区域,或者您的天线不好。

使用市场上的 GPS 测试应用程序检查天线是否有问题(通过比较两个设备)。

于 2013-03-12T07:52:25.497 回答
0

GPS 供应商有时需要电池电量,还需要检索 GPS 信号、预热硬件然后获取位置,如果是第一次使用它可能需要一些时间。

我建议使用新的 LocationRequest ,如果需要,它将在 GPS 或 NETWORK 之间进行选择以获取位置。

在 onCreate 中,我设置了我的 locationRequest

private fun setupLocationRequest(){
        locationCallback = LocationCallback()
        locationRequest = LocationRequest.create()
        locationRequest.interval = 10000
        locationRequest.fastestInterval = 2000
        locationRequest.priority = LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY
        fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
    }

正如您在此处看到的,PRIORITY_BALANCED_POWER_ACCURACY将为我提供一个最大纬度和经度的距离块,并且不仅会使用 GPS,而且会在需要时使用 NETWORK。

然后,我先请求lastKnowLocation,如果没有检索到这个位置,你可以请求位置更新

fusedLocationClient.lastLocation.addOnSuccessListener { lastLocation ->
                if(lastLocation != null){
                    calculateDistanceAndNavigate(lat,lng,lastLocation.latitude,lastLocation.longitude,radio)
                }else{
                    startLocationUpdates()
                    locationCallback = object : LocationCallback() {
                        override fun onLocationResult(locationResult: LocationResult?) {
                            locationResult ?: return
                            for (location in locationResult.locations) {
                                calculateDistanceAndNavigate(lat,lng,location.latitude,location.longitude,radio)
                            }
                        }
                    }
                }
            }

  private fun startLocationUpdates() {
        fusedLocationClient.requestLocationUpdates(
            locationRequest,
            locationCallback,
            Looper.getMainLooper()
        )
    }

对我来说,这是获取位置的最有效方法,首先我不只使用 GPS,而是节省电池并在需要时使用 NETWORK 或 WIFI,然后我请求 lastKnownLocation 如果它被保存(可能通过另一个应用程序,例如:谷歌地图),然后如果失败,我就开始请求位置更新(这可能需要一点时间)

于 2020-05-11T16:11:23.683 回答