我正在使用地方选择器的意图获得这个地方。现在我想以分开的形式保存地址,如国家,城市,密码,州。我如何从地方选择器的地址获得所有这些?
代码:
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());
}
}
}
}
这就是我实现地点选择器并获取地名onActivityResult的方法。我可以使用反向地理编码或其他东西吗?有人可以帮我解决这个问题吗?谢谢。
答案 0 :(得分:2)
我认为直接使用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());
}
}
}
}
答案 1 :(得分:2)
解决问题的最佳方法是使用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;
}
}
答案 2 :(得分:0)
如果您想将Place对象地址(街道,城市,国家等)的组件分开,您有两种选择。
Place.getLatLng()
。然后,反向对经度和经度进行地理编码。现在,解析地址并不容易。但是,对纬度和经度进行反向地理编码并不精确。我建议解析地址。那里有很好的地址解析服务,有些甚至可以根据地址数据库验证地址。 (我建议SmartyStreets。如果您转到SmartyStreets demo页面,请从下拉列表中选择&#34;自由格式地址&#34;然后查看搜索地址时返回的信息类型。)
这就是为什么反向地理编码可能是一个糟糕的解决方案。反向地理编码时,您将获取经度和纬度,并在算法上将其与地址匹配。一些算法将纬度和经度与最接近的实际地址相匹配。在这种情况下,地址可能不是您所在位置的地址。另一方面,一些算法近似于合理地适合纬度和经度的地址。在这种情况下,地址可能不是真实地址。 getLatLng()
Place place = PlacePicker.getPlace(data, getActivity());
中提到了另一个复杂问题:
该地点不一定是地方的中心,或任何特定的进入或退出点,而是地方地理范围内的一些任意选择的点。
由于纬度和经度是地理范围内的任意点,因此很难制作值得信赖的反向地理编码算法。
但是,你可能不在乎准确性。如果是这种情况&amp; emdash;你想要一个足够接近的地址,&#34;反向地理编码可能是一个不错的选择。
需要注意的另一件事是:
static Place getPlace(Intent intent,Context context) 此方法已弃用。请改用getPlace(Context,Intent)。
我认为你应该替换你的行:
Place place = PlacePicker.getPlace(getActivity(), data);
用这个:
{{1}}
完全披露:我为SmartyStreets工作。