首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android getLastKnownLocation 在 Nexus 返回 null:需主動請求定位更新

     編輯:程式設計綜合問答

原因

getLastKnownLocation 僅返回**上次其他 App 或系統記錄的快取位置**。Nexus 等裝置若近期無其他 App 請求定位,快取為空,返回 null。Galaxy Tab/HTC 可能因預載地圖/天氣 App 有快取,故能取得值。

正確做法:請求更新並回調中取得

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
    @Override public void onLocationChanged(Location location) {
        // 這裡拿到即時位置
        double lat = location.getLatitude();
        double lng = location.getLongitude();
        updateUI(lat, lng);
        // 若只需一次,可在此移除監聽
        lm.removeUpdates(this);
    }
    @Override public void onStatusChanged(String p, int s, Bundle e) {}
    @Override public void onProviderEnabled(String p) {}
    @Override public void onProviderDisabled(String p) {}
};

// 請求 GPS 更新(或 NETWORK_PROVIDER)
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);

進階:單次定位封裝

public void requestSingleLocationFix(Context context, OnLocationFix callback) {
    LocationManager lm = (LocationManager) context.getSystemService(LOCATION_SERVICE);
    LocationListener listener = new LocationListener() {
        @Override public void onLocationChanged(Location loc) {
            lm.removeUpdates(this);
            callback.onFix(loc);
        }
        // ... 其他方法空實現
    };
    // 同時請求 GPS 與 Network,先到者勝出
    if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER))
        lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, listener);
    if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER))
        lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, listener);
    
    // 設定超時保護(如 20 秒)
    new Handler(Looper.getMainLooper()).postDelayed(() -> {
        lm.removeUpdates(listener);
        callback.onTimeout();
    }, 20000);
}

現代最佳:FusedLocationProviderClient.getCurrentLocation()

fused.getCurrentLocation(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY, null)
     .addOnSuccessListener(location -> { /* 直接拿到 */ });

無需管理 Listener、Provider、權限檢查更簡潔,新專案首選。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved