1. 停止监听网络位置更新:
非常简单。只需调用
your_loc_manager.removeUpdates(network_location_listener);
2.如果GPS提供程序没有提供任何修复程序,则从网络提供程序获取位置
您可以尝试以下类似的方法(而不是计时器,您可以尝试使用GpsStatus Listener...)。
在获取网络提供程序更新的方法中
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)
}
hasGPSFix = false
这样做,您将从网络获取位置更新,而GPS将继续尝试修复。一旦GPS修复完成,hasGPSFix的值将发生变化,并且所述链接中的现有代码将停止寻找网络更新。至少这是我能理解您想要实现的内容。也许我没有完全理解您的意思。
编辑2:这是我处理GPS和NETWORK提供程序的类。
在需要获取位置更新的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;
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");
}
}
if (hasGPSFix) { Log.i("GPS","Fix Lost (expired)"); lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2000, 10, locationListener); } hasGPSFix = false;
在这里,你应该请求GPS和网络更新。当GPS Fix再次被获取时,相关处理已经存在,这样就可以做到了。 - Rajeev