[英]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 上使用位置提供程序進行任何操作的任何人來說,它都是必讀的。
典型的流程是:
查看下面的代碼,我們正在初始化一個 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.