![](/img/trans.png)
[英]Not getting user location using GPS_PROVIDER / NETWORK_PROVIDER
[英]Using OnStatusChanged to switch to NETWORK_PROVIDER from GPS_PROVIDER?
我正在开发需要精确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修复,如果不可用,则切换到NETWORK?
添加lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);
它将开始使用网络获取位置,但是一旦您从隧道中出来,它将开始从网络和GPS获取。 使用location.getProvider()
您应该能够区分出它是gps还是网络。
如果在应用程序运行时GPS状态没有改变(例如,如果您始终在室内而没有GPS定位),则某些设备将不会触发OnStatusChanged()
方法。
如果您在应用程序运行时更改GPS状态(例如,您在内部并且无法获得修复,然后在OnStatusChanged()
走走可以得到修复,反之亦然),则应在所有设备上触发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;
}
}
然后在您的Activity的OnCreate()中注册GPSStatusListener:
mService = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
mService.addGpsStatusListener(this);
在GPSTest应用程序中,基于此代码 ,每次GPSStatusListener更新都会在屏幕上显示当前可用卫星的列表。
这样,即使您的手机无法获得GPS定位(因此也可能不会触发LocationListener
OnStatusChanged
),您也会收到有关系统GPS状态的活动更新。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.