onLocationChanged()没有被调用

时间:2011-08-26 14:16:33

标签: android gps location

我知道这个问题已被提出,但我无法让它发挥作用。

此代码会转到请求位置部分。我知道现在的设置是糟糕的选择,但我只是想获得结果我现在不关心手机电池。我可以在Eclipse调试器中看到

"libloc" - "Latitude: XXXXX"    
"libloc" - "Longitude: XXXX"    
"libloc" - "Accuracy: 27000"

这意味着GPS正在运行。但我无法获得实际位置,因为LocationListener中的所有方法都没有触发。

    LocationManager lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if(loc==null){      
        String provider = null;

        if ( lm.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
            provider = LocationManager.GPS_PROVIDER;
        } else {
            Toast.makeText(this, "GPS not available", 3000).show();
            if(lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) {
                provider = LocationManager.NETWORK_PROVIDER;
            } else {
                Toast.makeText(this, "Provider Not available", 3000).show();
            }
        }

        if(provider != null) {
            lm.requestLocationUpdates(provider, 0, 0, locationListener);
        }

    } else {
        Latitude = loc.getLatitude();
        Longitude = loc.getLongitude();
    }

这是我的位置侦听器对象,它被声明略低于顶部代码。正在调用这些方法的(因此Log.d函数因此我可以添加断点,但在此侦听器中没有调用任何内容)。

double Latitude         = 0.0;
double Longitude        = 0.0;

LocationListener locationListener = new LocationListener(){

    @Override
    public void onLocationChanged(Location location) {
        Latitude = location.getLatitude();
        Longitude = location.getLongitude();
    }

    @Override
    public void onProviderDisabled(String provider) { Log.d("GPS", "HEY THERE"); }
    @Override
    public void onProviderEnabled(String provider) { Log.d("GPS", "HEY THERE"); }       
    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        Log.d("GPS", "HEY THERE");

    }

};

来自评论的其他信息:

  

事实并非如此。 loc =   lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);总是   返回null。 - Overload119 50分钟前

     

当您在IF中单步执行其余代码时会发生什么   声明? - 杰克44分钟前

     

我最终到达这一行:lm.requestLocationUpdates(provider,0,   0,locationListener);然后在调试器控制台消息中我可以看到   纬度,经度,准确性显示 - 及其反复显示,   所以我假设GPS已被激活并且它已经获得了   地点。问题是locationListener没有触发它的任何一个   方法。 - Overload119 41分钟前

     

我查看了链接,我的代码是一样的。 - 超载119分钟41分钟   之前提供商的价值是什么? - 杰克30分钟   前

     

提供者的价值是“gps” - 15分钟前Overload119          能够   你在onLocationChanged中设置一些断点来查看它是什么时候/是否   射击?如果您已经在运行应用程序之后完成了此操作   注册监听器后可能需要几秒钟   火。将手机移到一边等待。在某些时候它应该   反复射击。 - 杰克12分钟前

     

imm.io/8vXb这是一个截图    - 调试器显示GPS正在工作(请注意此事件   一遍又一遍地弹出)。我已经有了休息点   onLocationChanged() - 即使在等待之后它也永远不会到达它   延长的一段时间。它返回的纬度/经度始终是   同样如此。 - Overload119 39秒前编辑

     

我也试过打电话   lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);通过按钮,   并在控制台消息显示纬度/经度后单击它   收到了。 - 该方法返回的位置为null。    - Overload119 0秒前编辑

1 个答案:

答案 0 :(得分:3)

我猜你的Location loc始终由getLastKnownLocation()设置,因此你的if语句永远不会评估为true。你调试过,看看到底发生了什么:

Location loc = lm.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    if(loc==null){ ... }

根据我的理解,您应该仅使用getLastKnownLocation()来获取初始位置,然后注册您的听众以进行跟踪。

Here是您所需信息的绝佳链接。