在我的应用程序中,我必须查找给定位置是否属于指定区域。我以新德里康诺特广场为中心。我得到的地址距离中心点200英里。但是,如果我输入任何无效的位置,例如“abcdfdfkc”,应用程序崩溃了,因为它试图找到这个位置的坐标,我想避免这种情况。
下面我发布了代码:
public static boolean isServicedLocation(Context _ctx, String strAddress){
boolean isServicedLocation = false;
Address sourceAddress = getAddress(_ctx, "Connaught Place, New Delhi, India");
Location sourceLocation = new Location("");
sourceLocation.setLatitude(sourceAddress.getLatitude());
sourceLocation.setLongitude(sourceAddress.getLongitude());
Address targetAddress = getAddress(_ctx, strAddress);
Location targetLocation = new Location("");
if (targetLocation != null) {
targetLocation.setLatitude(targetAddress.getLatitude());
targetLocation.setLongitude(targetAddress.getLongitude());
float distance = Math.abs(sourceLocation.distanceTo(targetLocation));
double distanceMiles = distance/1609.34;
isServicedLocation = distanceMiles <= 200;
//Toast.makeText(_ctx, "Distance "+distanceMiles, Toast.LENGTH_LONG).show();
}
return isServicedLocation;
}
getAddress方法:
public static Address getAddress(Context _ctx, String addressStr) {
Geocoder geoCoder = new Geocoder(_ctx, Locale.getDefault());
try {
List<Address> addresses = geoCoder.getFromLocationName(addressStr,
1);
if (addresses.size() != 0) {
return addresses.get(0);
}
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
答案 0 :(得分:1)
这是因为当您没有从GeoCoder找到地址时(即addresses.size() == 0
),您将返回null
。
然后,无论如何,你取消引用该值,这就是你的应用程序崩溃的原因。
Address targetAddress = getAddress(_ctx, strAddress);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:
if (targetLocation != null) {
targetLocation.setLatitude(targetAddress.getLatitude());
^^^^^^^^^^^^^
您可能还应检查targetAddress
null
以避免这种情况(除了(可能)之外,或者代替(不太可能)检查targetLocation
)。
所以我正在考虑改变:
if (targetLocation != null) {
成:
if ((targetLocation != null) && (targetAddress != null)) {
这样,无效地址会自动成为未提供服务的位置。