2

我正在尝试从纬度和经度中获取用户的地址,如下所示:

LocationManager locationManager = (LocationManager)  
this.getSystemService(Context.LOCATION_SERVICE);
    // Define a listener that responds to location updates
    final LocationListener locationListener = new LocationListener() {
        public void onLocationChanged(Location location) {
            // Called when a new location is found by the network location provider.

            lat =location.getLatitude();
            lon = location.getLongitude();


        }

        public void onStatusChanged(String provider, int status, Bundle extras) {}

        public void onProviderEnabled(String provider) {}

        public void onProviderDisabled(String provider) {}
    };




    try{
        Geocoder geocoder;

        geocoder = new Geocoder(this, Locale.getDefault());
        addresses=(geocoder.getFromLocation(lat, lon, 1));

    }catch(IOException e){
        e.printStackTrace();
    }

    String address = addresses.get(0).getAddressLine(0);
    String city = addresses.get(0).getAddressLine(1);
    String country = addresses.get(0).getAddressLine(2);


    TextView tv = (TextView) findViewById(R.id.tv3);
    tv.setText(address+"\n"+city+"\n"+country);

// Register the listener with the Location Manager to receive location updates
    locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
}

每次我运行它时,我都会在“String address =addresses.get(0).getAddressLine(0);”的行上收到错误“IndexOutOfBoundsException: Invalid index 0, size is 0”。我了解该错误意味着我正在尝试访问不存在的内容,但我不确定是什么原因造成的。我一直在寻找获得地址的最佳方式,这就是我发现的,但它可能不是最有效或最好的方式。有什么建议么?

4

2 回答 2

3

纬度和经度仅在您的地理编码后触发的 onLocationchanged 中设置为它们各自的值,尝试在之前设置纬度和经度或将地理编码放在 onLocationChanged 中。我看不到所有代码,但我猜您正在将 lat 和 lon 初始化为 0,并且地理编码器没有 0,0 的地址

于 2013-07-07T00:38:34.893 回答
2

根据 Android 文档

用于处理地理编码和反向地理编码的类。地理编码是将街道地址或位置的其他描述转换为(纬度、经度)坐标的过程。反向地理编码是将(纬度、经度)坐标转换为(部分)地址的过程。反向地理编码位置描述中的详细信息量可能会有所不同,例如,一个可能包含最近建筑物的完整街道地址,而另一个可能仅包含城市名称和邮政编码。Geocoder 类需要一个不包含在核心 android 框架中的后端服务。如果平台中没有后端服务,Geocoder 查询方法将返回一个空列表。使用 isPresent() 方法确定是否存在 Geocoder 实现。

您没有Geocoder.isPresent()在代码中进行测试。很可能它只是没有在您的设备上实现,只是返回一个空列表。我从未使用过地理编码器,但我可以想象即使存在一个空列表,也可能会返回一个空列表,假设您正在指定一个位于海洋中间的位置。在访问列表内容之前,您应该始终测试列表的大小:

TextView tv = (TextView) findViewById(R.id.tv3);

if (addresses.size() > 0) {
    String address = addresses.get(0).getAddressLine(0);
    String city = addresses.get(0).getAddressLine(1);
    String country = addresses.get(0).getAddressLine(2);
    tv.setText(address+"\n"+city+"\n"+country);
} else {
    tv.setText("Oops...");
}
于 2013-07-07T00:36:09.100 回答