LocationListener适用于模拟器,而不是电话

时间:2011-02-04 01:21:44

标签: android geolocation gps locationlistener

我无法获取LocationListener来调用手机上的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) {   }
    });
}

2 个答案:

答案 0 :(得分:1)

onLocationChanged()在你真正开始接收GPS坐标之前不会开火。

我的意思是,在您开始接收数据之前,芯片必须根据我的经验预热约一分钟。

我通常会开始使用其他应用程序并等待它在我测试任何GPS应用程序之前证明GPS芯片已经预热。

我知道您提到它在Google地图中正常运行,但您是否尝试过清理内存并立即重新启动应用程序?

在开始接收coords之前,getLastKnownLocation()始终为null。

答案 1 :(得分:0)

位置框架在您的回调可用时将坐标推送到回调。根据天气等情况,您最初可能无法获得“修复”。当您的监听器成功注册时,您应该会在状态栏上看到“GPS”指示器。 getLastKnownPosition()工作正常(可能会返回null);谷歌地图使用它,而它正在等待位置提供商的初步修复。 您可能还想查看其他提供商可用的内容,例如单元塔数据,并尝试从那些(即LKP)获取数据,而不是或直到您的“首选”提供商开始推送数据。 此外,不要假设存在任何特定服务,例如LocationManagerContext.getSystemService()可以返回null),或者存在任何合适的提供商,(getBestProvider()可以返回null)。您的代码将在正确的设备上以正确的设置失败。如果文档说null,您必须检查它,否则用户将卸载它,因为FC到处都是。