位置监听器在模拟器上可以工作,但在手机上无法工作。

4

我在将LocationListener应用于手机时遇到了问题。当我在模拟器上运行我的代码时,一切正常,每次我执行一个geo fix操作时都会调用回调函数onLocationChanged()。

然而,在我的手机上运行应用程序时,却没有任何反应。回调函数从未被调用过。我的设置中已经启用了GPS和无线网络进行定位,应用程序也获得了位置权限的使用许可。

此外,当我从LocationManager对象中调用getLastKnownLocation()方法时,我的应用程序会崩溃。(仍然是在我那该死的手机上)。即使我试图捕获导致它崩溃的异常,它仍然会崩溃,所以我甚至无法获取任何有关导致它崩溃的信息。这非常令人沮丧。

LocationManager.getBestProvider()返回GPS,而且当我打开谷歌地图时,它立刻能够找到我的位置。这到底是怎么回事?我是否可以找出它在我的手机上为什么崩溃的原因?

    private void setupLocListener(){    
    Criteria c = new Criteria();
    c.setAccuracy(Criteria.ACCURACY_FINE);
    c.setAltitudeRequired(false);
    c.setBearingRequired(false);
    c.setSpeedRequired(false);
    c.setCostAllowed(false);
    lm.requestLocationUpdates(lm.getBestProvider(c,true), 0, 0, new LocationListener() {
        @Override
        public void onLocationChanged(Location arg0) {
            map.setLocation(arg0);
        }
        public void onProviderDisabled(String arg0) {   
        }
        public void onProviderEnabled(String arg0) {    
        }
        public void onStatusChanged(String arg0, int arg1, Bundle arg2) {   }
    });
}

1
使用 adb logcat、DDMS 或 Eclipse 中的 DDMS 视角来检查 LogCat 并查看与您的崩溃相关联的堆栈跟踪。 - CommonsWare
2个回答

1

只有在开始接收GPS坐标后,onLocationChanged()才会触发。

我的意思是,从我的经验来看,芯片需要大约一分钟左右的时间才能预热,然后您才能开始接收数据。

我通常会启动其他应用程序,并等待它证明GPS芯片已经预热好了,然后再测试我的GPS应用程序。

我知道您提到在Google Maps中它可以正常工作,但是您尝试过清除内存并立即重新启动应用程序吗?

此外,getLastKnownLocation()始终为空,直到您开始接收坐标。


你能澄清一下“开始接收坐标”的意思吗?你是指硬件必须触发它,还是需要进行任何函数调用来访问GPS信息? - Raj

0

当位置信息可用时,位置框架会将坐标推送到您的回调函数中。根据天气等因素,您可能一开始就无法获得“定位”。当您的监听器成功注册时,您应该在状态栏上看到“GPS”指示器。 getLastKnownPosition()可以正常工作(它可能返回null);而Google Maps在等待位置提供程序的初始修复期间使用它。 您还可以查看其他可用的提供程序,例如基站数据,并尝试从这些提供程序(即LKP)获取数据,而不是或直到您的“首选”提供程序开始推送数据为止。 此外,不要假设存在任何特定的服务,例如LocationManagerContext.getSystemService()可能返回null),或者存在任何合适的提供程序(getBestProvider()可能返回null)。如果文档说null,则必须检查它,否则用户将卸载它,因为它在各个地方都会FC。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接