3

如果 GPS_PROVIDER 的状态发生变化,我会尝试获取通知。我在这里找到了以下代码(http://hejp.co.uk/android/android-gps-example/),但我没有收到通知。

  1. 现在我在建筑物中,无法接收 GPS 信号,所以我不会收到“状态已更改:停止服务”的通知吗?
  2. 何时调用 onStatusChanged?
  3. 我究竟做错了什么?

谢谢,

@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
    /* This is called when the GPS status alters */
    switch (status) {
    case LocationProvider.OUT_OF_SERVICE:
        Log.v(tag, "Status Changed: Out of Service");
        Toast.makeText(this, "Status Changed: Out of Service",
                Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.TEMPORARILY_UNAVAILABLE:
        Log.v(tag, "Status Changed: Temporarily Unavailable");
        Toast.makeText(this, "Status Changed: Temporarily Unavailable",
                Toast.LENGTH_SHORT).show();
        break;
    case LocationProvider.AVAILABLE:
        Log.v(tag, "Status Changed: Available");
        Toast.makeText(this, "Status Changed: Available",
                Toast.LENGTH_SHORT).show();
        break;
    }
4

4 回答 4

22

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

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

如果您想要一个完全正常工作的开源应用程序作为示例,请尝试 GPSTest(完全公开,我的应用程序):

Google Play 上的 GPSTest - https://play.google.com/store/apps/details?id=com.android.gpstest

GPSTest 的源代码 - https://github.com/barbeau/gpstest

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

在您的活动中,使其实现GpsStatus.Listener,例如:

public class GpsTestActivity extends TabActivity
    implements LocationListener, GpsStatus.Listener{

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

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()您的 Activity 中注册 GPSStatus.Listener:

 mService = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
 mService.addGpsStatusListener(this);

在 GPSTest 应用程序中,当前可用卫星的列表显示在屏幕上,每个 GPSStatus.Listener 更新都基于以下代码:

https://github.com/barbeau/gpstest/blob/master/GPSTest/src/main/java/com/android/gpstest/GpsStatusFragment.java

这样,即使您的手机无法获得 GPS 定位(因此可能不会触发OnStatusChangedLocationListener),您也会收到系统 GPS 状态的活动更新。

于 2013-01-10T15:42:18.613 回答
1

也许您需要检查此链接GpsStatus.Listener 此侦听器用于了解 GPS 状态何时发生变化。

至于您指出的方法,它用于了解提供者状态何时更改,如文档LocationListener中所述

于 2013-01-08T19:15:14.197 回答
0

过去几周我一直在研究 GPS,无论我从测试中注意到什么,都有可能在建筑物内获取 GPS 信号。如果您在地下室区域,那么您将永远无法获得。我从家里试过,95% 的时间总是得到我的纬度和经度。

你无法控制这一点。如果有可用的 Internet 或 WiFi 连接,GpsLocationProvider 会自动使用辅助 SUPL。仅当无法访问 Internet 时才使用独立案例。辅助数据有助于锁定 GPS 卫星信号。在室内情况下,您可以看到 2-3 颗卫星(这取决于您的芯片组的质量)。如果无法扫描到卫星信号,则无法修复。

谢谢,拉梅什小号

于 2013-01-08T19:54:06.417 回答
0

Android 文档onStatusChanged方法已被弃用:

此回调永远不会在 Android Q 及更高版本上调用,并且提供程序可以被视为始终处于 LocationProvider#AVAILABLE 状态。

但是我发现它仍然需要实现即使Android Studio没有抱怨它,否则应用程序会崩溃

于 2021-02-06T01:16:53.050 回答