8

我正在使用地点选择器的意图来获取该地点。现在我想将地址以国家、城市、密码、州分开的形式保存。如何从地点选择器的地址中获取所有这些信息?

代码:

public class NameOfBusinessFragment extends Fragment {

    int PLACE_PICKER_REQUEST = 1;
    int RESULT_OK = -1;
    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder();
    EditText category,location;

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_name_of_business,
                    container, false);

            location = (EditText)view.findViewById(R.id.location);

            location.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    try {

                        startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST);
                    }
                    catch (GooglePlayServicesRepairableException e)
                    {
                        Toast.makeText(getActivity(),"ServiceRepaire Exception",Toast.LENGTH_SHORT).show();
                    }
                    catch (GooglePlayServicesNotAvailableException  e)
                    {
                        Toast.makeText(getActivity(),"SeerviceNotAvailable Exception",Toast.LENGTH_SHORT).show();
                    }
                }
            });

            return view;
        }
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PLACE_PICKER_REQUEST) {
            if (resultCode == RESULT_OK) {
                Place place = PlacePicker.getPlace(data, getActivity());
                String toastMsg = String.format("Place: %s", place.getName());


                Toast.makeText(getActivity(), toastMsg, Toast.LENGTH_LONG).show();
                location.setText(place.getName());
            }
        }
    }
}

这就是我实现地点选择器并在ActivityResult 上获取地点名称的方式。我可以使用反向地理编码或其他方法来获得这个吗?任何人都可以帮我解决这个问题吗?谢谢你。

4

3 回答 3

3

解决问题的最佳方法是使用Geocoder从纬度和经度获取地址,但如果出于任何原因不想使用它,以下解决方法可能会对您有所帮助。

尽管它不是 100% 可靠的,但您可以在 Google 提供这些详细信息之前使用它。对于某些随机情况,它可能无法给出完美的结果,但适用于大多数情况。

 public void getAddressDetails(Place place) {
        if (place.getAddress() != null) {
            String[] addressSlice = place.getAddress().toString().split(", ");
            country = addressSlice[addressSlice.length - 1];
            if (addressSlice.length > 1) {
                String[] stateAndPostalCode = addressSlice[addressSlice.length - 2].split(" ");
                if (stateAndPostalCode.length > 1) {
                    postalCode = stateAndPostalCode[stateAndPostalCode.length - 1];
                    state = "";
                    for (int i = 0; i < stateAndPostalCode.length - 1; i++) {
                        state += (i == 0 ? "" : " ") + stateAndPostalCode[i];
                    }
                } else {
                    state = stateAndPostalCode[stateAndPostalCode.length - 1];
                }
            }
            if (addressSlice.length > 2)
                city = addressSlice[addressSlice.length - 3];
            if (addressSlice.length == 4)
                stAddress1 = addressSlice[0];
            else if (addressSlice.length > 3) {
                stAddress2 = addressSlice[addressSlice.length - 4];
                stAddress1 = "";
                for (int i = 0; i < addressSlice.length - 4; i++) {
                    stAddress1 += (i == 0 ? "" : ", ") + addressSlice[i];
                }
            }
        }
        if(place.getLatLng()!=null)
        {
            latitude = "" + place.getLatLng().latitude;
            longitude = "" + place.getLatLng().longitude;
        }
    }
于 2016-08-24T15:03:03.930 回答
3

我认为直接使用 Place 类是不可能的,但你可以从纬度和经度开始向谷歌查询。下面是您的 onActivityResult 方法的示例:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (requestCode == PLACE_PICKER_REQUEST) {
        if (resultCode == RESULT_OK) {
            // get place data
            Place place = PlacePicker.getPlace(data, getActivity());

            // ask for geolocation data
            Geocoder gcd = new Geocoder(this, Locale.getDefault());
            List<Address> addresses = null;
            try {
                addresses = gcd.getFromLocation(place.getLatLng().latitude, place.getLatLng().longitude, 1);
            } catch (IOException e) {
                e.printStackTrace();
            }
            if (addresses.size() > 0) {
                String toastMsg = String.format("Place: %s", addresses.get(0).getLocality() + " - " + addresses.get(0).getCountryName() + " - " + addresses.get(0).getCountryCode());
                Toast.makeText(getActivity(), toastMsg, Toast.LENGTH_LONG).show();


                // NOW SET HERE CORRECT DATA
                //location.setText(place.getName());

            }
        }
    }
}
于 2016-08-04T14:33:38.483 回答
1

如果您希望将 Place 对象地址的组成部分(街道、城市、国家/地区等)分开,您有两种选择。

  1. 使用Place.getLatLng(). 然后,反向地理编码纬度和经度。
  2. 解析地址。

现在,解析地址并不容易。但是,对纬度和经度进行反向地理编码并不精确。我建议解析地址。那里有很好的地址解析服务,有些甚至根据地址数据库验证地址。(我建议SmartyStreets。如果你去SmartyStreets 演示页面,从下拉列表中选择“自由格式地址”,然后看看当你搜索地址时会返回什么样的信息。)


这就是为什么反向地理编码可能是一个糟糕的解决方案。当您反向地理编码时,您会获取纬度和经度并通过算法将其与地址匹配。一些算法将纬度和经度与最近的真实地址相匹配。在这种情况下,地址可能不是您所在位置的地址。另一方面,一些算法会近似一个地址,该地址可以合理地适应纬度和经度。在这种情况下,地址可能不是真实地址。文档中提到了另一个并发症getLatLng()

该位置不一定是场所的中心,或任何特定的入口或出口点,而是场所地理范围内任意选择的点。

由于纬度和经度是该地点地理范围内的任意点,因此很难制定可靠的反向地理编码算法。

但是,您可能不关心准确性。如果是这种情况——您想要一个“足够近”的地址,反向地理编码可能是一个不错的选择。


还有一点需要注意:

static Place getPlace(Intent intent, Context context) 此方法已弃用。请改用 getPlace(Context, Intent)。

我认为你应该更换你的线路:

Place place = PlacePicker.getPlace(data, getActivity());

有了这个:

Place place = PlacePicker.getPlace(getActivity(), data);

全面披露:我在 SmartyStreets 工作。

于 2017-01-05T17:33:31.400 回答