Androids onStatusChanged 不起作用

Posted

技术标签:

【中文标题】Androids onStatusChanged 不起作用【英文标题】:Androids onStatusChanged not working 【发布时间】:2012-12-22 17:29:43 【问题描述】:

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

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

谢谢,

@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;
    

【问题讨论】:

【参考方案1】:

如果您的 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

在你的Activity中,让它实现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;
    


然后在你的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 修复,则不会调用状态更改。 对不起,让我为其他正在查看此内容的人澄清一下。我收到的通知是从 GPS 锁定到暂时不可用。不是从没有 gps 锁(当我在大楼里时)到有 gps 锁。换句话说,在我开始接收任何状态更改通知之前,我必须先锁定 GPS。 抱歉有点颠簸,但我将如何在后台服务中使用您的解决方案?我的意思是我在后台服务中有 LocationListener 没有 onCreate @arleitiss 您应该仍然可以在您的服务的onCreate()onStartCommand() 中注册 GPSStatus.Listener。基本上,每当您的服务启动并执行一些代码时,运行与上述答案中相同的 mService = getSystemService...mService.addGpsStatus... 行。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

谢谢, 拉梅什S

【讨论】:

在我家我可以得到很好的 gps,但在我所在的大楼里我不能。我的代码有问题吗?为什么我没有收到 GPS 状态通知? 您如何确定您没有收到停止服务的回调。由于您正在显示 Toast 并且持续时间很短,因此可能有机会,它会显示并且您可能会错过。我过去尝试过类似的方法,它曾经显示相应的状态,当我移动时可用,一旦我到达商场或我的办公室,它没有使用过服务或不可用.. 我认为您可以在展示吐司时振动,因此您可以快速查看您的 mboile 状态【参考方案4】:

Android 文档 says 指出 onStatusChanged 方法刚刚被弃用:

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

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

【讨论】:

以上是关于Androids onStatusChanged 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

androids 网络位置提供程序的准确性和速度如何?

某些 androids 应用程序无法通过 fiddler 连接

某些 androids 应用程序无法通过 fiddler 连接

在 Kotlin 中查询 Androids ContactsContract

Android构建系统gradle

Appium环境搭建