我正在开发一个需要精确的GPS修复的应用程序。如果GPS_PROVIDER已启用,但不可用(就像在隧道中时),我希望我的应用程序切换到NETWORK_PROVIDER。
我可以使用locationListener的OnStatusChanged OUT_OF_SERVICE来识别是否无法进行GPS修复吗?
如下所示:
public void onStatusChanged(String provider, int status, Bundle extras) {
//0 = OUT_OF_SERVICE
if (status == 0) {
//try requesting updates using NETWORK_PROVIDER
lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);
//TOAST MESSAGE: GPS UNAVAILABLE ATTEMPTING FIX WITH NETWORK
...我是否正确地使用了OnStatusChanged?有没有更简单更好的方法来先尝试GPS修复,如果不可用,就切换到网络?
发布于 2013-01-11 01:47:56
添加lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);它将开始使用网络获取位置,但一旦你从隧道中出来,它将开始从网络和全球定位系统获取。使用location.getProvider(),你应该能够区分它是全球定位系统还是网络。
如果你的GPS状态在应用程序运行时没有改变(例如,如果你总是在室内没有GPS修复),一些设备将不会触发OnStatusChanged()方法。
如果你在应用程序运行时改变了GPS状态(例如,你在里面,无法得到修复,然后走到外面,可以得到修复,反之亦然),那么OnStatusChanged()方法应该会在所有设备上触发。
如果你想要一个完全正常工作的开源应用作为例子,可以试试安卓团队的Mike Lockwood的GPSTest。
有关GPS的更多详细信息,即使您的设备无法获得修复,也会不断更新,您可能需要注册一个GPSStatusListener。
private LocationManager mService;
private GpsStatus mStatus;...and添加处理GPSStatus更改的方法:
public void onGpsStatusChanged(int event) {
mStatus = mService.getGpsStatus(mStatus);
switch (event) {
case GpsStatus.GPS_EVENT_STARTED:
// Do Something with mStatus info
break;
case GpsStatus.GPS_EVENT_STOPPED:
// Do Something with mStatus info
break;
case GpsStatus.GPS_EVENT_FIRST_FIX:
// Do Something with mStatus info
break;
case GpsStatus.GPS_EVENT_SATELLITE_STATUS:
// Do Something with mStatus info
break;
}
}然后在您的活动的OnCreate()中注册GPSStatusListener:
mService = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mService.addGpsStatusListener(this);在GPSTest应用程序中,当前可用的卫星列表将根据此code随每个GPSStatusListener更新一起显示在屏幕上。
这样,即使您的手机无法获得GPS修复(因此可能不会触发LocationListener的OnStatusChanged ),您也会收到系统的GPS状态的活动更新。
https://stackoverflow.com/questions/14263878
复制相似问题