机器人onStatusChanged无法正常工作

the*_*eld 3 gps android location locationmanager locationlistener

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

  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;
    }
Run Code Online (Sandbox Code Playgroud)

Sea*_*eau 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.

在您的Activity中,让它实现GpsStatus.Listener,例如:

public class GpsTestActivity extends TabActivity
    implements LocationListener, GpsStatus.Listener{
Run Code Online (Sandbox Code Playgroud)

然后,在您的活动中声明类变量:

private LocationManager mService;
private GpsStatus mStatus;
Run Code Online (Sandbox Code Playgroud)

...并添加处理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;
    }

}
Run Code Online (Sandbox Code Playgroud)

然后在OnCreate()您的Activity中注册GPSStatus.Listener:

 mService = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
 mService.addGpsStatusListener(this);
Run Code Online (Sandbox Code Playgroud)

在GPSTest应用程序中,屏幕上会显示当前可用的卫星列表,每个GPSStatus.Listener都会根据以下代码进行更新:

https://github.com/barbeau/gpstest/blob/master/GPSTest/src/main/java/com/android/gpstest/GpsStatusFragment.java

这样,即使您的手机无法获得GPS定位(因此可能无法触发OnStatusChangedLocationListener),您也会收到系统GPS状态的有效更新.