【问题标题】:Android: GPS - several satellites in view but none used in fixAndroid:GPS - 可以看到几颗卫星,但没有用于修复
【发布时间】:2014-09-04 23:02:14
【问题描述】:

有什么原因导致有时视野中有几颗卫星,但没有一颗用于修复?

我制作了一个小应用程序来跟踪 gps 位置,有时它会显示 8 颗以上的卫星,但没有一个用于修复。

请看下面的图片。它说明了正在发生的事情:

每个“绿色箭头”都指向设备所在的位置+方向。红线是我所说的“差距”。手机已开机,应用程序正在运行,并且 locationmanager 一直在接收“卫星状态更新”,但在红线中它得到 0 颗“用于修复”的卫星。

这发生在几种不同的设备型号(手机和平板电脑)和不同的 android 版本(3.x 到 4.x)上。

我正在努力解决这个问题。感谢任何帮助。

编辑:

一些相关代码:

@Override
public void onCreate()
{
    // when service is created, we start monitoring gps status 

    GpsStatus.Listener gpsStatusListener        = new GpsStatus.Listener()
    {

        @Override
        public void onGpsStatusChanged(int event)
        {
                LocationManager lm = (LocationManager) GooglePlayLocationServices.this.getSystemService(Context.LOCATION_SERVICE);
                GpsStatus gpsStatus = lm.getGpsStatus(null);
                String msg = "";

                if (event == GpsStatus.GPS_EVENT_STARTED)
                {
                        msg = "onGpsStatusChanged: " + "GPS_EVENT_STARTED";
                }
                else if (event == GpsStatus.GPS_EVENT_STOPPED)
                {
                        msg = "onGpsStatusChanged: " + "GPS_EVENT_STOPPED";
                }
                else if (event == GpsStatus.GPS_EVENT_FIRST_FIX)
                {
                        msg = "onGpsStatusChanged: " + "GPS_EVENT_FIRST_FIX";
                        msg += " = " + ((gpsStatus != null) ? gpsStatus.getTimeToFirstFix() / 1000 : 0) + "s";
                }
                else if (event == GpsStatus.GPS_EVENT_SATELLITE_STATUS)
                {
                        msg = "onGpsStatusChanged: " + "GPS_EVENT_SATELLITE_STATUS";
                        if (gpsStatus != null)
                        {
                                Iterable<GpsSatellite> satellites = gpsStatus.getSatellites();
                                Iterator<GpsSatellite> sat = satellites.iterator();
                                int i = 0;
                                int used = 0;
                                while (sat.hasNext())
                                {
                                        i++;
                                        GpsSatellite satellite = sat.next();
                                        if (satellite.usedInFix())
                                                used++;
                                }
                                msg += " - satelites = " + used + "/" + i;
                                lastSatelitesInfo = used + "/" + i;
                        }
                }
                if (msg.length() > 0)
                        log(msg);
        }

    };

    LocationManager locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
    locationManager.addGpsStatusListener(gpsStatusListener);
)

日志输出:

[02/09/14 18:42:01] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 18:42:02] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 18:42:03] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
...
[02/09/14 18:44:23] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 18:44:24] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 18:44:25] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
...
[02/09/14 18:52:08] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 18:52:09] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 18:52:10] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
...
[02/09/14 19:56:32] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 19:56:33] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
[02/09/14 19:56:34] onGpsStatusChanged: GPS_EVENT_SATELLITE_STATUS - satelites = 0/11
...

【问题讨论】:

    标签: android gps


    【解决方案1】:

    设备可能在这些“间隙”期间处于睡眠状态 - 当您关闭屏幕时,设备进入睡眠状态,应用程序不再接收 CPU 访问权限并且无法执行任何操作。

    如果您想确保设备在跟踪期间处于唤醒状态,您需要获取PowerManager.WakeLock。假设这是您的方法:

    PowerManager.WakeLock mWakelock;
    
    public void doSomething() {
        mWakelock = ((PowerManager)getSystemService(Context.POWER_SERVICE))
                    .newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "wakelock_name");
    
        mWakelock.acquire();
    
        // Your long-running code
    
        mWakelock.release();
    }
    

    另外,如果您这样做,请不要忘记将android.permission.WAKE_LOCK 权限添加到您的 AndroidManifest.xml

    【讨论】:

    • 感谢您的快速回复。 1) 我在跟踪时已经获得了唤醒锁。正如我所提到的,我仍然得到卫星更新(8 个卫星在视野中,但没有一个在修复中,等等......)。所以应用程序一直处于唤醒状态! 2) 同样正如我所提到的,我用几十台设备进行了这个测试。
    • 能否附上相关源码?这是在没有实际看到您的代码的情况下想到的唯一一件事......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多