Как можно раздвоить адресный компонент, который я получаю напрямую из Google Place API? - PullRequest
2 голосов
/ 27 сентября 2019

Я хочу получить город, штат, страну, пин-код в другой переменной, например, когда я получаю адрес, широту и долготу.Но я не знаю, как получить адрес по компонентам.

public class MainActivity extends AppCompatActivity {
String TAG = "placeautocomplete";
String API = "xxxxxxxxxxxxxxxxx";
String Latitude;
String Longitude;
double lat, lng;
String Address,Place_name,Phone,Complete_address;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    edit = findViewById(R.id.editText);
    txtView = findViewById(R.id.txtView);
    // Initialize Places.
    Places.initialize(getApplicationContext(), API);
    // Create a new Places client instance.
    PlacesClient placesClient = Places.createClient(this);

    // Initialize the AutocompleteSupportFragment.
    if (!Places.isInitialized()) {
        Places.initialize(getApplicationContext(), API);


    }

    // Initialize the AutocompleteSupportFragment.
    AutocompleteSupportFragment autocompleteFragment = (AutocompleteSupportFragment)
            getSupportFragmentManager().findFragmentById(R.id.autocomplete_fragment);

    assert autocompleteFragment != null;

    autocompleteFragment.setPlaceFields(Arrays.asList(Place.Field.ID, Place.Field.NAME,Place.Field.LAT_LNG, Place.Field.ADDRESS,Place.Field.PHONE_NUMBER));
    autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
        @Override
        public void onPlaceSelected(Place place) {
            // TODO: Get info about the selected place.
            Log.i(TAG, "Place: " + place.getName() + ", " + place.getId());

            if (place.getLatLng() !=null){
                lat =place.getLatLng().latitude;
                lng =place.getLatLng().longitude;

            }
            Latitude = String.valueOf(lat);
            Longitude= String.valueOf(lng);
            Address= place.getAddress();
            Place_name = place.getName();
            Phone = place.getPhoneNumber();

        }
        @Override
        public void onError(Status status) {
            // TODO: Handle the error.
            Log.i(TAG, "An error occurred: " + status);
        }
    });
}
 }

Я просто хочу обратиться к таким компонентам, как Адрес, Город, Штат, Пин.

1 Ответ

0 голосов
/ 28 сентября 2019

Вы должны использовать не Address= place.getAddress(), а .getAddressComponents() для этого, потому что .getAddress() возвращает String с понятным для человека адресом места и в Официальной документации, которую Google написал:

Не анализировать форматированный адрес программно.Вместо этого вы должны использовать отдельные компоненты адреса, которые включает в себя ответ API в дополнение к форматированному полю адреса.

Таким образом, вы должны использовать Place.getAddressComponents(), чтобы получить List<AddressComponent>а затем получить имя и тип каждого компонента адреса .Или воспользуйтесь дополнительным запросом на ввод значений lat / lng и Geocoder.getFromLocation() как в Отображение адреса местоположения Официальный пример:

...
Geocoder geocoder = new Geocoder(this, Locale.getDefault());
List<Address> addresses = null;

...
addresses = geocoder.getFromLocation(
            Latitude,    // <-- your Latitude = String.valueOf(lat);
            Longitude,   // <- your Longitude= String.valueOf(lng);
            location.getLongitude(),
            // In this sample, get just a single address.
            1);

// Handle case where no address was found.
if (addresses == null || addresses.size()  == 0) {
    if (errorMessage.isEmpty()) {
        errorMessage = getString(R.string.no_address_found);
        Log.e(TAG, errorMessage);
    }
    deliverResultToReceiver(Constants.FAILURE_RESULT, errorMessage);
} else {
    Address address = addresses.get(0);
    ArrayList<String> addressFragments = new ArrayList<String>();

    // Fetch the address lines using getAddressLine,
    // join them, and send them to the thread.
    for(int i = 0; i <= address.getMaxAddressLineIndex(); i++) {
        addressFragments.add(address.getAddressLine(i));
    }
}
...

Также взгляните на Руководство разработчика .

PS Не используйте заглавные буквы (например, Latitude) для переменных - это стиль для классов.Назовите это просто latitude.

...