【问题标题】:requestLocationUpdate takes too longrequestLocationUpdates 耗时过长
【发布时间】:2013-02-26 00:11:33
【问题描述】:

我只有一台设备 (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 秒)

【问题讨论】:

  • 您需要更细粒度的 GPS 还是可以通过其他提供商获得?
  • 我需要使用 GPS,因为我的应用程序将在没有 wifi/互联网的情况下使用 ^^ 所以,我必须使用 GPS(在任何地方获取数据纬度/经度/高度的唯一方法?)
  • 您无需等待(或轮询)最后一个已知位置。一旦修复可用,将立即调用位置侦听器。如果可以从较早的 GPS 请求中获得修复,则最后一个已知位置可能很有用。如果没有可用的 null 则返回(顺便说一句,这会使你的循环崩溃)。

标签: android gps locationlistener


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您是否连接到数据网络?

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

      您也可能是在室内或信号较弱的区域,或者您的天线有问题。

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

      【讨论】:

      • 是的,我做到了!问题是一样的。所以......正如你所说,我认为问题是一个低信号区域。
      【解决方案4】:

      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 如果它被保存(可能通过另一个应用程序,例如:谷歌地图),然后如果失败,我就开始请求位置更新(这可能需要一点时间)

      【讨论】:

        猜你喜欢
        • 2013-06-16
        • 2011-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-04
        • 2019-08-02
        相关资源
        最近更新 更多