简体   繁体   中英

Restrict Places Autocomplete API to cities of specific country android

I am using PlaceAutocompleteApi from Play Services, what I want to do is restrict auto-complete to specific country & city only. Eg. All cities from lets say India only. I am using AutocompleteFilter to do so but I don't know where to specify country that I want to restrict.

Here is my code

        List<Integer> autocompleteFilter = new ArrayList<>();
//        autocompleteFilter.add(Place.TYPE_COUNTRY);
//        autocompleteFilter.add(Place.TYPE_LOCALITY);


        mAdapter = new PlaceAutocompleteAdapter(mContext,R.layout.layout_location_text,
                mGoogleApiClient, BOUNDS, AutocompleteFilter.create(autocompleteFilter));
        mTxtLocation.setAdapter(mAdapter);

        mTxtLocation.setOnItemClickListener(mAutocompleteClickListener);

any thoughts on this?

The way to do that is to add the country as the components parameter to the web service URL:

StringBuilder sb = new StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON);
sb.append("?key=" + API_KEY);
sb.append("&components=country:in");

For cities you can use either the administrative_area_level_3 tag:

sb.append("&components=administrative_area_level_3:bengaluru");

or alternatively the locality tag:

sb.append("&components=locality:redmond");

References:

1. Geocoding API .

2. Address Types and Component Types .

3. Google Place API Autocomplete Service in Android Application .

Here's a workaround (hack if you will) that I used. It utilizes (exploits) the fact that when converted to string, each response item is a comma separated string. Do the following steps before returning the result to getFilter() .

  1. Get the suggestions into an ArrayList , call it returnedResults .
  2. Now traverse over returnedResults and in each iteration get each prediction into a string array using returnedResults.get(i).getFullText(xxx).toString().split(",") .
  3. If the last element of this array is your country's name, insert it in a separate ArrayList variable, let's call it myResult .
  4. return myResult .

The reason for using separate variables is because you might not be able to manipulate the original response list so easily. This approach works like a charm!

Hope this helps.

Filter results by country

// Create Filter
AutocompleteFilter typeFilter = new AutocompleteFilter.Builder()
    .setCountry("AU")
    .build();
// Attach to autocomplete fragment / widget
autocompleteFragment.setFilter(typeFilter);
val sb = StringBuilder(PLACES_API_BASE + TYPE_AUTOCOMPLETE + OUT_JSON)
            sb.append("?key=$API_KEY")
            sb.append("&types=establishment")
            sb.append("&location=$locationLat,$LocationLng")
            sb.append("&radius=50000&strictbounds")
            sb.append("&input=" + URLEncoder.encode(input, "utf8"))

This api will restrict the search to area.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM