2013-01-08 75 views
2

我试图在GPS_PROVIDER的状态发生变化时收到通知。我在这里找到了下面的代码(http://hejp.co.uk/android/android-gps-example/),但我没有收到通知。机器人onStatusChanged不工作

  1. 现在我在建筑物里,无法获取GPS信号,所以我不会收到“Status Changed:Out of Service”的通知?
  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; 
    } 

回答

20

如果您的GPS状态没有发生变化(例如,如果你总是在室内无GPS定位),而应用程序正在运行,一些设备将不会触发OnStatusChanged()方法。

如果您在应用程序运行时更改了GPS状态(例如,您在里面并且无法获得修复,然后走到外面并且可以修复,反之亦然),那么OnStatusChanged()方法应该会触发所有设备。

如果你想要一个完全正常的开源应用作为一个例子,就试试GPSTest(完全公开,我的应用程序):

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

该W ay,即使您的手机无法获得GPS定位,您也会收到有关系统GPS状态的有效更新(因此可能无法触发LocationListener的OnStatusChanged)。

+0

感谢这一点。几天前,我的应用程序正在运行,当我走出我的建筑物时,我收到了状态更改的通知。它看起来像位置侦听器,如果你永远无法得到一个GPS定位,在状态改变不会被调用。 – thedeepfield

+1

对不起,让我澄清谁正在看这个。我收到的通知是从一个GPS锁定暂时不可用。不是从没有gps锁(当我在大楼里)到拥有gps锁。换句话说,在我开始接收任何状态改变通知之前,我必须先拥有一个GPS锁。 – thedeepfield

+0

对不起,我会如何使用你的解决方案在后台服务?我的意思是我在后台服务中有LocationListener,它没有onCreate – arleitiss

1

也许你需要检查这个环节GpsStatus.Listener 这个监听器使用时,GPS状态发生了变化就知道了。

,并为您指出的方法,它是用来知道什么时候,如文档中提到的LocationListener

0

我制作的GPS过去几个星期的供应商的地位改变,无论我从我的测试中我们注意到,可能是在建筑物内获取GPS信号的可能性。如果你在地下室区域,那么你永远不会得到。我从家里试过,95%的时间总是让我的纬度和经历永远保持。

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

感谢, 拉梅什小号

+0

在我的房子我可以得到gps罚款,但在建筑im我不能。我的代码有一些错误吗?为什么我没有收到GPS状态通知? – thedeepfield

+0

你怎么确定,你没有收到退出服务的回调。由于您正在显示吐司,并且时间很短,所以可能会有机会,它会显示,您可能会错过。我过去尝试过类似的方式,它用于显示相应的状态。当我移动时,并且一旦我到达一个商场或我的办公室,它使用不停止服务或不可用..我想你可以振动的时候显示吐司,所以你可以快速查看你的mboile状态 –