当没有从地理坐标中找到城市时,LocationManager会崩溃

时间:2014-11-19 02:07:57

标签: java android locationmanager reverse-geocoding

我正在使用Locationmanager获取用户GeoPoints,然后将其转换为城市/州。问题在于,当发生这种情况时,某些用户会“崩溃”,当我将如下所示的地理点转换为城市转换时,它们不会崩溃。所以我指出了这一点,并且我认为根据他们的地理坐标,它会为某些人返回null。 如果我绝对需要,有没有更可靠的方法来获得某个城市?

public class UserLocation implements LocationListener {
        @Override
        public void onLocationChanged(Location loc) {

            if (loc != null)
            {

                mLatitude = loc.getLatitude();
                mLongitude = loc.getLongitude();
                Geocoder geoCoder = new Geocoder(getActivity(), Locale.getDefault());
                List<Address> addresses;
                try {
                    addresses = geoCoder.getFromLocation(mLatitude, mLongitude, 10);
                     int i=1;
                     for(Address addObj:addresses)
                     {
                         // Looping once
                         if(i==1)
                         { 

                             //Setting city
                             mCity = addObj.getSubLocality();                            
                             //setting state
                             mState = returnStateAbbreviation(addObj.getAdminArea());


                             i++;
                         }
                     }
                } catch (IOException e1) {

                    e1.printStackTrace();
                }}
            else
            {
                Log.i(mTag, "No location found, hrmp?");
            }
            // Stopping Location Updates
            mLocationManager.removeUpdates(mLocationListener);
        }

或者更简单地比较2个地理位置以显示它们之间的距离,然后列出而不是城市和州?

1 个答案:

答案 0 :(得分:0)

正如@Selvin所说,getFromLocation可以根据docs

返回null
  

返回   Address对象列表。如果未找到匹配项或没有可用的后端服务,则返回 null或空列表

在遍历地址之前,您需要检查它是否为空

addresses = geoCoder.getFromLocation(mLatitude, mLongitude, 10);
if (addresses != null) {
    int i=1;
    for(Address addObj:addresses)
    {
        ...
    }
}

关于你的第二个问题,这取决于你想做什么,但计算两点之间的距离很容易。您可以使用this Location method

public static void distanceBetween (double startLatitude, double startLongitude, double endLatitude, double endLongitude, float[] results)