1.停止偵聽網絡位置更新: 這樣做非常簡單。只需撥打
your_loc_manager.removeUpdates(network_location_listener);
2.獲取位置從網絡提供商,如果GPS提供商沒有給出任何解決 你可以嘗試像下面給出的(而不是定時器,你可以嘗試使用GpsStatus監聽器...)
用於獲取網絡提供商的更新
boolean network_enabled ;
try {
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {
ex.printStackTrace();
}
if(!network_enabled)
return;
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener);
return;
裏面的方法獲得的GPS位置的方法中
boolean gps_enabled;
try {
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {
ex.printStackTrace();
}
if(!gps_enabled) {
// call your method for getting network location updates
return;
}
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps);
new Timer().schedule(new TimerTask() {
@Override
public void run() {
// You should call your method of getting Network locations based on some
// condition which would tell whether you really need to ask for network location
}
}, 20000 /* Time Value after which you want to stop trying for GPS and switch to Network*/);
編輯1:
還有「我並不需要知道什麼時候從GPS獲取更新,我需要知道什麼時候能得到來自網絡的更新(我的意思是,我需要知道在GPS搜索,而不是固定時)。以及如何控制網絡和GPS」
之間的互換性......如果修復已丟失那麼只有你需要尋找網絡更新,所以我曾建議打電話
if (hasGPSFix) {
Log.i("GPS","Fix Lost (expired)");
lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener);
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 2000, 10, locationListener); //===> new line which I am suggesting
}
hasGPSFix = false;
這樣,你將從網絡獲取位置更新,而GPS將繼續嘗試修復,一旦GPS修復完成,GPSFix將更改其值,並且該鏈接中的現有代碼將停止查找網絡更新。至少這是我能理解的你想達到的目標可能是我沒完全理解你
編輯2: 這是我處理了GPS和網絡提供商
的mapActivity或任何你需要獲得位置更新,你需要創建這個MyLocation
類的實例類。此外,要繼續獲取位置更新信息,您需要在您的通話活動中實施LocationResult
。 public abstract void gotLocation(Location location, boolean isGpsData);
會告訴你剛剛收到的更新是來自網絡還是GPS。此外,如果數據從GPS返回,它會自動關閉網絡監聽器。如果您需要GPS等數據,您需要撥打getFineLocation()
方法。您需要針對自己的目的增強所提供的代碼(例如,當您只想刪除網絡更新等時,您需要增強closeListeners()
方法來關閉一個提供程序......),但它會基本實現您的目標想要(當然還有GpsStatus.Listener
的實現,所以兩者結合應該很好地滿足你的目的)。
public class MyLocation {
LocationManager locManager;
LocationResult locationResult;
boolean gps_enabled = false;
boolean network_enabled = false;
public boolean getCoarseLocation(Context context, LocationResult result) {
locationResult = result;
if(locManager == null)
locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
try {
network_enabled = locManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
} catch(Exception ex) {
ex.printStackTrace();
}
if(!network_enabled)
return false;
locManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 100, networkLocationListener);
return true;
}
public boolean getFineLocation(Context context, LocationResult result) {
locationResult = result;
if(locManager == null)
locManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);
try {
gps_enabled = locManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
} catch(Exception ex) {
}
if(!gps_enabled)
return false;//No way to get location data
locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 100, locationListenerGps);
return true;
}
LocationListener locationListenerGps = new LocationListener() {
public void onLocationChanged(Location location) {
locationResult.gotLocation(location,true);
locManager.removeUpdates(networkLocationListener);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
LocationListener networkLocationListener = new LocationListener() {
public void onLocationChanged(Location location) {
locationResult.gotLocation(location,false);
}
public void onProviderDisabled(String provider) {}
public void onProviderEnabled(String provider) {}
public void onStatusChanged(String provider, int status, Bundle extras) {}
};
public void closeListeners() {
if(locManager == null)
return;
if(locationListenerGps != null)
locManager.removeUpdates(locationListenerGps);
if(networkLocationListener != null)
locManager.removeUpdates(networkLocationListener);
}
public static abstract class LocationResult {
public abstract void gotLocation(Location location, boolean isGpsData);
}
public static boolean hasNetworkProvider(Context mContext) {
List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false);
return myProvidersList.contains("network");
}
public static boolean hasGPSProvider(Context mContext) {
List<String> myProvidersList = ((LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE)).getProviders(false);
return myProvidersList.contains("gps");
}
}
//你應該打電話給你基於某些 //條件這會告訴你是否真的需要問的網絡位置獲取網絡位置的方法。 我的評論: 這是我的問題,我似乎無法找到一種方式來形成該條件,條件是如果gps是固定的或不。 GPS啓用與否的問題不是問題,問題在於瞭解gps是否能夠響應或正在搜索衛星(這就是我的意思是固定或搜索) –
然後,我認爲你應該看看這[回答](http://stackoverflow.com/a/6782146/430480)。它幾乎在做你想做的事情。如果(hasGPSFix) { Log.i(「GPS」,「Fix Lost(expired)」); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER,2000,10,locationListener); } hasGPSFix = false;'這裏你應該請求GPS和網絡更新。這應該這樣做,因爲相關的處理似乎已經在那裏時,GPS Fix已被再次獲得 – Rajeev
這個答案是無效的,我試過,因爲他使用的方法 Global.getInstance()。currentGPSLocation這是一個無效的方法,doesn'從我所看到的全球課堂中存在。另一件事是,我不需要知道什麼時候從GPS獲取更新,我需要知道什麼時候從網絡獲取更新(我的意思是我需要知道什麼時候GPS正在搜索,而不是當它是固定的)。以及如何控制網絡和GPS之間的互換性。 –