簡體   English   中英

requestLocationUpdate 花費的時間太長

[英]requestLocationUpdate takes too long

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

我認為您應該在開發位置感知應用程序之前閱讀此http://developer.android.com/guide/topics/location/strategies.html指南。

GPS 傳感器需要 1 到 3 分鍾才能修復,您無法快速修復(1 到 5 秒即可)。

您應該使用最后一個已知的位置值並開始請求位置修復。 當你有一個時,你相應地刷新你的內容。

當您在建築物內或覆蓋區域內時,GPS 傳感器可能需要更多時間。 有時,如果您在建築物內並且沒有可用的 GPS 信號,則它總是閃爍並消耗大量電池電量。 嘗試使用其他一些提供程序。

您是否連接到數據網絡?

我不了解 HTC,但通常當數據連接可用時,該設備會使用一種稱為輔助 GPS 的東西。 從服務器下載衛星星歷,而不是掃描地平線上的所有可見衛星,獲得修復所需的時間為 10-20 秒。

也有可能您在室內或低信號區域,或者您的天線有問題。

使用市場上的 GPS 測試應用程序檢查天線是否有問題(通過比較兩個設備)。

GPS 提供商有時會消耗電池電量,並且還需要檢索 GPS 信號、預熱硬件然后獲取位置,如果第一次使用它,這可能需要一些時間。

我建議使用新的 LocationRequest,如果需要,它將在 GPS 或 NETWORK 之間進行選擇以獲取位置。

在 onCreate 我設置我的位置請求

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 如果它被保存(可能由另一個應用程序,例如:谷歌地圖),然后如果失敗,我就開始請求位置更新(這可能需要一點時間)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM