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之间的互换性。 –