¿Cómo obtener el país, la ciudad de la dirección del selector de lugares?

Estoy usando la intención de un recolector de lugar para conseguir el lugar. Ahora quiero guardar la dirección en forma separada como país, ciudad, código PIN, estado. ¿Cómo puedo obtener todo esto desde la dirección del recolector de lugares?

Código:

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()); } } } } 

Así es como implementé selector de lugar y obteniendo el nombre de lugar onActivityResult. ¿Puedo obtener esto usando un geocódigo inverso o algo así? ¿Puede alguien ayudarme con esto por favor? Gracias.

Creo que no es posible usar la clase de lugar directamente, pero puedes pedirle a Google que empiece desde la latitud y la longitud. A continuación un ejemplo de su método 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()); } } } } 

La mejor manera de resolver su problema es utilizando Geocoder para obtener la dirección de la latitud y la longitud, pero si por alguna razón si no desea utilizarlo después de la solución puede ayudarle.

Aunque no es 100% confiable , puedes usarlo hasta que Google proporcione esa información detallada. Puede no dar resultados perfectos para algunos casos aleatorios, pero funciona para la mayoría.

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

Si desea separar los componentes de la dirección de objeto Lugar (calle, ciudad, país, etc), tiene dos opciones.

  1. Utilice Place.getLatLng() . A continuación, invierta geocodificar la latitud y la longitud.
  2. Analice la dirección.

Ahora, analizar una dirección no es muy fácil. Pero, la geocodificación inversa de la latitud y la longitud no es precisa. Sugiero analizar la dirección. Hay buenos servicios de análisis de direcciones por ahí, y algunos incluso validar la dirección contra las bases de datos de direcciones. (Sugiero SmartyStreets : si vas a la página de demostración de SmartyStreets , selecciona "Freeform address" en el menú desplegable y verás qué tipo de información vuelve cuando buscas una dirección).


Aquí es por qué la geocodificación inversa puede ser una solución deficiente. Cuando invierte el geocódigo, toma una latitud y una longitud y combina algorítmicamente con una dirección. Algunos algoritmos coinciden con la latitud y longitud con la dirección real más cercana. En este caso, la dirección podría no ser la dirección de su ubicación. Por otro lado, algunos algoritmos aproximan una dirección que se ajustaría razonablemente a la latitud y longitud. En este caso, la dirección puede no ser una dirección real. Otra complicación se menciona en la documentación de getLatLng() :

La ubicación no es necesariamente el centro del lugar, o cualquier punto de entrada o salida particular, sino algún punto elegido arbitrariamente dentro de la extensión geográfica del lugar.

Debido a que la latitud y la longitud son puntos arbitrarios dentro de la extensión geográfica del lugar, es difícil hacer algoritmos de geocodificación inversa confiables.

Pero, es posible que no te importe la exactitud. Si ese es el caso-que desea una dirección que es "lo suficientemente cerca", la geocodificación inversa podría ser una buena opción.


Otra cosa a tener en cuenta:

static Place getPlace (Intención intención, Context context) Este método fue obsoleto. Use getPlace (Context, Intent) en su lugar.

Creo que deberías reemplazar tu línea:

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

con este:

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

Divulgación completa: Trabajo para SmartyStreets.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.