0

在我的应用程序中,我必须找出给定位置是否位于指定区域之下。我以新德里的康诺特广场为中心点。我得到了距离中心点 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;
}

获取地址方法:

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;
}
4

1 回答 1

1

这是因为当您没有从 GeoCoder 中找到地址时(即 if addresses.size() == 0),您会返回null.

然后,不管怎样,您取消引用该值,这就是导致您的应用程序崩溃的原因。

Address targetAddress = getAddress(_ctx, strAddress);
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
:
if (targetLocation != null) {
    targetLocation.setLatitude(targetAddress.getLatitude());
                               ^^^^^^^^^^^^^

您可能还应该检查targetAddressnull避免这种情况(除了(可能),或者代替(不太可能),检查targetLocation)。

所以我会考虑改变:

if (targetLocation != null) {

进入:

if ((targetLocation != null) && (targetAddress != null)) {

这样一来,无效地址会自动成为未提供服务的位置。

于 2012-09-11T03:01:19.510 回答