机器人onStatusChanged无法正常工作

时间:2013-01-08 19:00:47

标签: android gps location locationmanager locationlistener

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

  1. 现在我在一栋楼里,无法获得GPS信号,所以我不会收到“状态已更改:停止服务”的通知吗?
  2. 什么时候调用onStatusChanged?
  3. 我做错了什么?
  4. 谢谢,

    @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 个答案:

答案 0 :(得分:20)

如果您的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()中注册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定位,您也会收到系统GPS状态的有效更新(因此可能无法触发LocationListener的OnStatusChanged。)

答案 1 :(得分:1)

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

,对于您指出的方法,它用于了解文档LocationListener

中提到的提供者状态何时发生变化

答案 2 :(得分:0)

过去几周我在GPS上工作,无论我在测试中注意到什么,都有可能在建筑物内部获取GPS信号。如果你在地下室,那么你永远不会得到。我在家里试过,95%的时间总是得到我的纬度和经度。

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

谢谢, Ramesh S

答案 3 :(得分:0)

Android 文档 says 表明 onStatusChanged 方法已被弃用:

<块引用>

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

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

相关问题