requestLocationUpdates需要太长时间

时间:2013-03-10 21:45:42

标签: android gps locationlistener

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

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

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

所以,我不得不创建一个像这样的while指令:

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

谢谢,我肯定会找到最近的位置,但是我失去了太多时间。

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

4 个答案:

答案 0 :(得分:2)

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

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

您应该使用上次已知的位置值并开始请求位置修复。如果有,则相应地刷新内容。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您是否已连接到数据网络?

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

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

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

答案 3 :(得分:0)

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

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

在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(也许由另一个应用程序提供) ,例如:google maps),然后如果失败,我就开始请求位置更新(可能需要一点时间)