我正在开发一款需要准确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修复,如果不可用,切换到网络?
答案 0 :(得分:3)
添加lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);
它将开始使用网络获取位置,但是一旦您从隧道出来,它将开始从网络和GPS获取。使用location.getProvider()
,你应该能够区分出来知道它是gps还是网络。
如果您的GPS状态没有变化(例如,如果您总是在室内没有GPS修复),则在应用程序运行时,某些设备将不会触发OnStatusChanged()
方法。
如果您在应用程序运行时更改了GPS状态(例如,您在里面并且无法修复然后走到外面并且可以获得修复,反之亦然),那么OnStatusChanged()
方法应该在所有设备上启动。
如果您想要一个完全正常工作的开源应用程序作为示例,请尝试Android团队的Mike Lockwood的GPSTest。
有关即使您的设备无法修复的GPS不断更新的详细信息,您也可能需要注册GPSStatusListener。
在您的Activity中,声明类变量:
private LocationManager mService;
private GpsStatus mStatus;
...并添加处理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定位,您也会收到系统GPS状态的有效更新(因此可能无法触发OnStatusChanged
的{{1}}。< / p>