有很多有關的LocationManager問題,並獲得用戶的位置的不同方法。但是,其中大部分都集中在準確性上,而且由於要求不同,我的方法有點不同。 我需要的是約。用戶的GPS位置儘可能快(但僅在用戶點擊按鈕後),並且一些EditText框應填充座標。問題是,在大多數情況下,設備上的數據傳輸將被禁用,因此網絡位置將不可用。我必須堅持不能通過設計快速的GPS。所以這裏是我做的:如何儘可能取消LocationManager.requestSingleUpdate?
按鈕單擊我打電話給我的主要活動getGPS()方法,因爲我不關心準確性(我只需要獲得一個大約座標)我檢查最後已知的位置,代碼中的註釋是不言自明
public void getGPS(View view) {
// load all available Location providers
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
List<String> providers = locationManager.getProviders(false);
// determine the last known location within 2 hours available from cache
Location myLocation = null;
Date now = new Date();
long time = now.getTime();
long timeDiff = LOCATION_MAX_AGE;
for (int i=providers.size()-1; i>=0; i--) {
Location l = locationManager.getLastKnownLocation(providers.get(i));
if (l != null) {
long t = l.getTime();
if (time - t < timeDiff) {
myLocation = l;
time = t;
timeDiff = time - t;
}
}
}
// if failed to get cached location or if it is older than 2 hours, request GPS position
if (myLocation == null) {
if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) {
pIntent = PendingIntent.getBroadcast(context,
0,
new Intent(SINGLE_UPDATE_ACTION),
PendingIntent.FLAG_UPDATE_CURRENT);
IntentFilter iFilter = new IntentFilter(SINGLE_UPDATE_ACTION);
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// when received an answer from the LocationManager
Location gpsLocation = (Location) intent.getExtras().get(LocationManager.KEY_LOCATION_CHANGED);
fillLocation(gpsLocation);
Log.d(TAG, "Received GPS location: " + gpsLocation.getLatitude() + ", " + gpsLocation.getLongitude() + " Time: " + gpsLocation.getTime());
locationManager.removeUpdates(pIntent);
unregisterReceiver(receiver);
}
};
context.registerReceiver(receiver, iFilter);
// I'm absolutely fine with getting the first available GPS position and that's enough to me.
locationManager.requestSingleUpdate(LocationManager.GPS_PROVIDER, pIntent);
// if GPS is disabled in settings allow user to enable it
} else {
showGPSDisabledAlertToUser();
}
} else {
// if fresh enough lastKnownLocation is found
fillLocation(myLocation);
}
}
所有工作得非常好,在大多數情況下是有lastKnownLocation和座標顯示用戶點擊按鈕後即可。但是當我不那麼幸運時,會出現GPS圖標,問題就來了。由於沒有可用的數據連接,所以GPS修復比平常花費的時間更長。在此期間,活動仍然可以訪問,並且用戶並沒有真正意識到座標即將出現。另一個問題是,當用戶無法在合理的時間內獲得GPS定位時,他應該能夠取消該請求。
所以,我的問題是:什麼在這裏是最好的方法? 更具體:是否有可能表現出像一個等待對話框,用戶(例如「獲取GPS位置......」)和一鍵式「取消」,這可能會中斷請求,並把用戶返回到(如何?)主要活動,停止任何GPS活動並顯示敬酒要求用戶手動輸入座標?
很抱歉,如果這是一件很容易的,我剛開始學的Android開發和我的應用程序,除了這件事情幾乎已經完成。我很努力地搜索,沒有發現任何不幸的事情。提前謝謝了!
編輯:只是一個半小時,我貼我的問題後,我意識到,我可能已經知道答案。我可能需要打開一個等待光標的對話框來阻止用戶界面,顯示我的消息和取消按鈕並從那裏請求LocationManager。如果用戶在我們修復之前點擊取消,我應該取消註冊我的接收器並關閉對話框。 當然,我會明天嘗試這個,但任何想法或建議,甚至評論都非常歡迎!
路易斯,謝謝,這正是我昨天想到的(請參閱我的編輯),但我肯定接受你的答案,因爲它爲我節省了一些時間,找到了對話類的正確名稱:) – remarkov