0

我正在开发一个需要准确 GPS 定位的应用程序。如果GPS_PROVIDER启用但不可用(例如当您在隧道中时),我希望我的应用程序切换到NETWORK_PROVIDER.

我可以使用 locationListenerOnStatusChanged 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?

4

1 回答 1

3

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

如果您的 GPS 状态在应用程序运行时没有发生变化(例如,如果您始终在室内没有 GPS 定位),则某些设备不会触发该OnStatusChanged()方法。

如果您在应用程序运行时更改 GPS 状态(例如,您在室内但无法获得定位,然后走到外面却可以获得定位,反之亦然),则该OnStatusChanged()方法应在所有设备上触发。

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

Google Play 上的 GPS 测试

GPSTest 的源代码

有关即使您的设备无法修复也会不断更新的 GPS 的更多详细信息,您可能需要注册一个 GPSStatusListener。

在您的活动中,声明类变量:

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 定位(因此可能不会触发 ),您也会收到系统 GPS 状态的主动OnStatusChanged更新LocationListener

于 2013-01-10T17:47:56.417 回答