AndroidManifest.xml 必須宣告 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION,且 Android 6.0+ 需動態請求。1000ms / 10m。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 {
// 引導使用者開啟定位
}
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。