反向地理编码返回IndexOutOfBoundsException

时间:2015-06-15 21:03:02

标签: android android-location reverse-geocoding

我试图在吐司中显示一个简单的位置名称。在这种情况下,它是一个流行的点,如“洛杉矶”。我使用以下代码:

Geocoder geocoder = new Geocoder(getActivity(), Locale.getDefault());

    try {
        List<Address> addresses = geocoder.getFromLocation(34.0500, -118.2500, 1);

        //Line Where the error occurs
        String cityandstate = addresses.get(0).getLocality() + ", " + addresses.get(0).getAdminArea();

        Toast.makeText(getActivity(), cityandstate, Toast.LENGTH_LONG).show();

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

当我运行此操作时,收到错误java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0。我不完全确定我做错了什么。感谢所有帮助!

更新

添加我的权限,以澄清:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>

1 个答案:

答案 0 :(得分:1)

getFromLocation不会返回任何结果,也不会检查该情况。然后你尝试访问第一个结果,但它不存在,你得到一个IndexOutOfBoundException。

在访问结果之前,您应该进行空值和大小检查以消除异常:

if (addresses != null && addresses.size() > 0) {
   String cityandstate = addresses.get(0).getLocality() + ", " + addresses.get(0).getAdminArea();
   ...
} else {
  // give feedback to the user
}

为什么没有得到结果可能是由于不同的原因。这里有一些想法。

在添加以下权限之前,我遇到了与Geocoder类似的问题。

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

似乎没有此权限,Geocoder并不总是有效,因为它无法缓存结果。 (Android尝试尽可能优化对服务器的调用。)

另一个问题可能是,如果您不在真实设备上进行测试,而是在模拟器或Android的某些特殊安装上进行测试。

以下是Geocoder文档的片段。

  

如果没有,Geocoder查询方法将返回一个空列表   平台中的后端服务。使用isPresent()方法   确定是否存在Geocoder实现。