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

Android 獲取當前位置:Network Provider 不回調問題排查

     編輯:程式設計綜合問答

常見原因清單

  1. 權限缺失:AndroidManifest.xml 必須宣告 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION,且 Android 6.0+ 需動態請求。
  2. 定位服務關閉:使用者未開啟「裝置定位」或「Wi-Fi 掃描/藍牙掃描」輔助定位。
  3. Network Provider 不可用:部分裝置/ROM 移除或禁用 Network Provider,僅支援 GPS。建議**同時請求 GPS 與 Network**,先用可用者。
  4. minTime/minDistance 設為 0:雖合法,但部分實作會導致頻繁回調或濫用保護,建議設 1000ms / 10m。
  5. 在主執行緒阻塞:requestLocationUpdates 需 Looper,若在無 Looper 執行緒呼叫需自行 Looper.prepare()。

健壯的定位請求代碼

LocationManager lm = (LocationManager) getSystemService(LOCATION_SERVICE);
LocationListener listener = new LocationListener() {
    @Override public void onLocationChanged(Location loc) { updateUI(loc); }
    @Override public void onProviderEnabled(String p) { /* 可提示開啟 GPS */ }
    @Override public void onProviderDisabled(String p) { /* 可引導設定 */ }
    @Override public void onStatusChanged(String p, int status, Bundle extras) {}
};

// 優先嘗試 GPS,失敗再嘗試 Network
if (lm.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 10, listener);
} else if (lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
    lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 10, listener);
} else {
    // 引導使用者開啟定位
}

現代替代:FusedLocationProviderClient

Google Play Services 提供 FusedLocationProviderClient,自動融合 GPS/Wi-Fi/基地台/感測器,API 更簡潔、耗電更低、支援優先級設定:

FusedLocationProviderClient fused = LocationServices.getFusedLocationProviderClient(this);
LocationRequest req = LocationRequest.create().setPriority(LocationRequest.PRIORITY_BALANCED_POWER_ACCURACY).setInterval(1000);
fused.requestLocationUpdates(req, callback, Looper.getMainLooper());

新專案強烈建議遷移至 Fused API。

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