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 应用程序无法通过 fiddler 连接
某些 androids 应用程序无法通过 fiddler 连接