繁体   English   中英

使用OnStatusChanged从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。

Google Play上的GPSTest

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM