使用OnStatusChanged从GPS_PROVIDER切换到NETWORK_PROVIDER?

时间:2013-01-10 17:35:06

标签: android gps locationmanager locationlistener

我正在开发一款需要准确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修复,如果不可用,切换到网络?

1 个答案:

答案 0 :(得分:3)

添加lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, ll);它将开始使用网络获取位置,但是一旦您从隧道出来,它将开始从网络和GPS获取。使用location.getProvider(),你应该能够区分出来知道它是gps还是网络。

如果您的GPS状态没有变化(例如,如果您总是在室内没有GPS修复),则在应用程序运行时,某些设备将不会触发OnStatusChanged()方法。

如果您在应用程序运行时更改了GPS状态(例如,您在里面并且无法修复然后走到外面并且可以获得修复,反之亦然),那么OnStatusChanged()方法应该在所有设备上启动。

如果您想要一个完全正常工作的开源应用程序作为示例,请尝试Android团队的Mike Lockwood的GPSTest。

GPSTest on Google Play

Source code for 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>