安卓onStatusChanged无法工作

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个回答

22
如果您的GPS状态没有改变(例如,当您一直在室内没有GPS信号时),某些设备将不会触发 OnStatusChanged() 方法。
如果您在应用程序运行时更改GPS状态(例如,您在室内无法获取信号,然后走到室外可以获得信号,反之亦然),则所有设备都应该触发 OnStatusChanged() 方法。
如果您想要一个完全可用的开源应用程序作为示例,请尝试GPSTest(完全透明,这是我的应用程序):
GPSTest on Google Play - 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{

然后,在你的 Activity 声明类变量:

private LocationManager mService;
private GpsStatus mStatus;

...并添加处理GPS状态变化的方法:

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() 中注册 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信号(因此可能不会触发LocationListener的OnStatusChanged),您也可以接收到有关系统GPS状态的及时更新。

谢谢。几天前,当我走出大楼时,我的应用程序正在运行,我收到了一个状态更改的通知。看起来对于LocationListener,如果您一开始就无法获得GPS定位,onStatusChange将不会被调用。 - thedeepfield
1
抱歉,让我为那些正在查看此内容的人澄清一下。我收到的通知是因为GPS锁定暂时不可用,而不是从没有GPS锁定(当我在建筑物内时)到有GPS锁定。换句话说,在开始接收任何状态更改通知之前,我必须先获得GPS锁定。 - thedeepfield
抱歉有点打扰,但我该如何在后台服务中使用您的解决方案?我的意思是,我在后台服务中有一个LocationListener,它没有onCreate方法。 - arleitiss
@arleitiss,您仍然可以在Service的onCreate()onStartCommand()中注册GPSStatus.Listener。基本上,每当您的Service启动并执行一些代码时,请运行与上面答案中相同的mService = getSystemService...mService.addGpsStatus...行。 - Sean Barbeau

1

也许你需要查看这个链接 GpsStatus.Listener,这个监听器用于了解 GPS 状态何时发生了变化。

至于你提到的方法,它是用于了解提供者状态何时发生变化的,正如文档中所述 LocationListener


0

我过去几周一直在GPS方面工作,从我的测试中发现,有可能在建筑物内获取GPS信号。如果你在地下室区域,那么你永远不会得到信号。我在家里尝试了很多次,95%的时间都能够获取到我的纬度和经度。

这是无法控制的。如果有可用的互联网或WiFi连接,GpsLocationProvider会自动使用辅助SUPL。独立情况仅在无法访问互联网时使用。辅助数据有助于锁定GPS卫星信号。在室内情况下,您可以看到2-3颗卫星(这取决于您芯片组的质量)。如果无法扫描到任何卫星信号,则无法获得定位。

谢谢, Ramesh S


在我的房子里,我可以很好地获取GPS信号,但在我所在的建筑物内却无法获取。我的代码有问题吗?为什么我没有收到GPS状态的通知? - thedeepfield
你如何确保没有收到“服务不可用”的回调?因为你正在显示Toast,而且持续时间很短,有可能会出现错过的情况。我以前尝试过类似的情况,当我在移动时,它通常会显示相应的“可用”状态,但一旦我到达商场或办公室,它就会显示“服务不可用”。我认为你可以在显示Toast的同时振动手机,这样你就可以快速查看状态了。 - Ramesh Sangili

0

Android文档onStatusChanged方法已被弃用:

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

但我发现即使Android Studio没有报错,仍需要实现它,否则应用程序会崩溃。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接