單用 NETWORK_PROVIDER 定位時有時獲取不到坐標,因網絡定位依賴基站/WiFi,信號弱或無網絡時失效。最佳實踐:並行請求 GPS 與網絡定位,優先使用最先返回的有效結果。
LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
LocationListener listener = new MyLocationListener();
// 同時請求兩個提供者
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
// 在 onLocationChanged 中處理
@Override
public void onLocationChanged(Location location) {
// 可根據 provider 判斷來源
if (location.getAccuracy() < bestAccuracy) {
bestLocation = location;
bestAccuracy = location.getAccuracy();
}
// 獲得足夠精度後可移除監聽節省電量
if (bestAccuracy < 50) {
lm.removeUpdates(this);
}
}
| 特性 | GPS_PROVIDER | NETWORK_PROVIDER |
|---|---|---|
| 精度 | 高 (10-50m) | 低 (100-1000m) |
| 室內可用 | 否 | 是 |
| 耗電 | 高 | 低 |
| 首次定位時間 | 慢 (30s+) | 快 (秒級) |
FusedLocationProviderClient (Google Play Services) 自動融合多源定位,API 更簡單、精度更高、耗電更低。minTime/minDistance 避免過頻繁更新。removeUpdates 釋放資源。雙源並行 + 智能選擇,定位成功率大幅提升。