首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >安卓: GPS -有几颗卫星在望,但没有一颗用于fix。

安卓: GPS -有几颗卫星在望,但没有一颗用于fix。
EN

Stack Overflow用户
提问于 2014-09-04 13:38:14
回答 1查看 2.2K关注 0票数 1

有什么理由可以解释为什么有时会有几颗卫星在望,但没有一颗卫星被用于修复系统?

我做了一个小应用程序来跟踪全球定位系统的位置,有时它会显示8+卫星的视野,但没有一个用于fix。

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

每个“绿色箭头”都指向该设备的location+direction。红线是我所说的“空白”。手机开着,应用程序在运行,位置管理人员一直在接收“卫星状态更新”,但在红线上,它得到了0颗“用于修复”的卫星。

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

我正在想办法解决这个问题。感谢你的帮助。

编辑:

一些相关守则:

代码语言:javascript
运行
复制
@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);
)

日志输出:

代码语言:javascript
运行
复制
[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
...
EN

回答 1

Stack Overflow用户

发布于 2014-09-04 14:10:16

在这些“空白”期间,设备可能处于休眠状态--当您关闭屏幕时,设备就会进入休眠状态,应用程序将不再接受CPU的访问,什么也做不了。

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

代码语言:javascript
运行
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25666989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档