我试图在吐司中显示一个简单的位置名称。在这种情况下,它是一个流行的点,如“洛杉矶”。我使用以下代码:
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"/>
答案 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实现。