簡體   English   中英

當提供者是 gps 時,返回的位置為空?

[英]Location returned is null when provider is gps?

我正在嘗試在以下代碼中檢索我當前的位置坐標

LocationManager locationManager= (LocationManager) getSystemService(context);

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);

provider = locationManager.getBestProvider(criteria, true);
Location location = locationManager.getLastKnownLocation(provider);

當提供者為“網絡”時,我得到位置坐標。

當我更改位置和安全選項中的設置以啟用“使用 GPS 衛星”選項時,提供商更改為“ gps ”。 在這種情況下,返回的位置為空。

這可能是什么原因,如何糾正?

GPS 提供商需要一段時間才能進行修復,尤其是在之前未進行修復的情況下。 getLastKnownLocation 不是阻塞調用,它會等到建立實際的實時 GPS 定位(該定位可能需要長達 1 分鍾,取決於各種原因)。

另外,請確保您出於顯而易見的原因在外面)。

不是簡單地為 GPS 提供者調用 getLastKnownLocation,您首先需要從它請求位置更新。

下面這篇文章很好地解釋了原理: http : //developer.android.com/guide/topics/location/obtaining-user-location.html

對於在 Android 上使用位置提供程序進行任何操作的任何人來說,它都是必讀的。

典型的流程是:

  1. 開始申請。
  2. 開始偵聽來自所需位置提供商的更新。
  3. 通過過濾掉新的但不太准確的修復來保持位置的“當前最佳估計”。
  4. 停止監聽位置更新。
  5. 利用最后的最佳位置估計。

查看下面的代碼,我們正在初始化一個 MyLocationListener(以跟蹤手機的位置),並檢索對 LocationManager 的引用。 我們正在從位置管理器請求位置更新。 我們使用 10 米的 minDistance(通知的最小距離間隔)和 35 秒的 minTime(通知的最小時間間隔)。

LocationListener locationListener = new MyLocationListener();
LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 35000, 10, this.locationListener);

在實現這一點時,您可能會注意到 MyLocationListener 收到的更新比您預期的要多(給定 minTime 和 minDistance 參數)。 http://blog.doityourselfandroid.com/2010/12/25/understanding-locationlistener-android/ 上的以下文章可以幫助您理解原因。

我認為問題在於 GPS 需要幾秒鍾才能同步。 您必須使用線程。 拿這個例子:

@Override
public void run() {
    
    mLocationManager = (LocationManager)context.getSystemService(Context.LOCATION_SERVICE);
    
    if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
        Looper.prepare();
        mToast.Make(getContext(),"GPS",0);
        mLocationListener = new MyLocationListener();
        mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, mLocationListener);
        Looper.loop(); 
        Looper.myLooper().quit(); 
        
    } else if (mLocationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER)){
        Looper.prepare();
        mToast.Make(getContext(),"Triangulacion",0);
        mLocationListener = new MyLocationListener();
        mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, mLocationListener);
        Looper.loop();
        Looper.myLooper().quit();
    }else{
        mToast.Make(context,"No se encuentra señal se procede a mandar un mensaje normal",0);
        Looper.prepare();
        handlerNormal.sendEmptyMessage(0);
        Looper.loop();
        Looper.myLooper().quit();
    }   
    
}

並添加一個位置監聽器類

private class MyLocationListener implements LocationListener 
{
    @Override
    public void onLocationChanged(Location loc) {
        if (loc != null) {
            setCurrentLocation(loc);
            handler.sendEmptyMessage(0);
        }
    }  
//...  
} 

移動設備連接到某些衛星需要幾秒鍾的時間。 只要手機沒有連接,因為連接還沒有建立,位置就會為空。

您也必須向 GPS 提供商請求位置更新。

locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);

暫無
暫無

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

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