Search code examples
androidgoogle-mapssearchandroid-searchmanager

How to retrieve search suggestion from google places?


I need to have the list of suggestions of cities/streets/villages while I am typing into the search bar. I found out that I have to implement contentProvider and I make it. Now, for everything I type, I get the same result:

"Search Result"

While Google Places should return the correct list of the locations. Can someone help me? How can I make my search work as it works on googlemaps? (I mean the suggestions, the Geocoder stuff is done already). Thanks a lot


Solution

  • Here is the Code Snippet Which i have Used when i have similar problem.

    here is my PlacesAutoCompleteAdapter.java File.

    package com.inukshk.adapter;
    
    import java.util.ArrayList;
    
    import android.content.Context;
    import android.widget.ArrayAdapter;
    import android.widget.Filter;
    import android.widget.Filterable;
    
    import com.inukshk.CreateInukshk.CreateInukshk;
    
    public class PlacesAutoCompleteAdapter extends ArrayAdapter<String> implements
            Filterable {
        private ArrayList<String> resultList;
    
        public PlacesAutoCompleteAdapter(Context context, int textViewResourceId) {
            super(context, textViewResourceId);
        }
    
        @Override
        public int getCount() {
            return resultList.size();
        }
    
        @Override
        public String getItem(int index) {
            return resultList.get(index);
        }
    
        @Override
        public Filter getFilter() {
            Filter filter = new Filter() {
                @Override
                protected FilterResults performFiltering(CharSequence constraint) {
                    FilterResults filterResults = new FilterResults();
                    if (constraint != null) {
                        // Retrieve the autocomplete results.
    
                        resultList = CreateInukshk.autocomplete(constraint
                                .toString());
    
                        // Assign the data to the FilterResults
                        filterResults.values = resultList;
                        filterResults.count = resultList.size();
                    }
                    return filterResults;
                }
    
                @Override
                protected void publishResults(CharSequence constraint,
                        FilterResults results) {
                    if (results != null && results.count > 0) {
                        notifyDataSetChanged();
                    } else {
                        notifyDataSetInvalidated();
                    }
                }
            };
            return filter;
        }
    }
    

    here is What you have to do inside OnCreate() of your activity.

    autoCompView = (AutoCompleteTextView) findViewById(R.id.editloc);
            autoCompView.setAdapter(new PlacesAutoCompleteAdapter(this,
                    R.layout.list_item));
    

    here are the static Strings i have used in app.

    private static final String PLACES_API_BASE = "https://maps.googleapis.com/maps/api/place";
        private static final String TYPE_AUTOCOMPLETE = "/autocomplete";
        private static final String OUT_JSON = "/json";     
        private static final String API_KEY = "YOUR API KEY";
    

    and Finally here is the Method that you will use in Adapter.

    public static ArrayList<String> autocomplete(String input) {
    
            ArrayList<String> resultList = null;
    
            HttpURLConnection conn = null;
            StringBuilder jsonResults = new StringBuilder();
            try {
                StringBuilder sb = new StringBuilder(PLACES_API_BASE
                        + TYPE_AUTOCOMPLETE + OUT_JSON);
                sb.append("?sensor=false&key=" + API_KEY);
                // sb.append("&components=country:uk");
                sb.append("&input=" + URLEncoder.encode(input, "utf8"));
    
                URL url = new URL(sb.toString());
                conn = (HttpURLConnection) url.openConnection();
                InputStreamReader in = new InputStreamReader(conn.getInputStream());
    
                // Load the results into a StringBuilder
                int read;
                char[] buff = new char[1024];
                while ((read = in.read(buff)) != -1) {
                    jsonResults.append(buff, 0, read);
                }
            } catch (MalformedURLException e) {
                Log.e(TAG, "Error processing Places API URL", e);
                return resultList;
            } catch (IOException e) {
                Log.e(TAG, "Error connecting to Places API", e);
                return resultList;
            } finally {
                if (conn != null) {
                    conn.disconnect();
                }
            }
    
            try {
                // Create a JSON object hierarchy from the results
                JSONObject jsonObj = new JSONObject(jsonResults.toString());
                JSONArray predsJsonArray = jsonObj.getJSONArray("predictions");
    
                // Extract the Place descriptions from the results
                resultList = new ArrayList<String>(predsJsonArray.length());
                for (int i = 0; i < predsJsonArray.length(); i++) {
                    resultList.add(predsJsonArray.getJSONObject(i).getString(
                            "description"));
                }
    
            } catch (JSONException e) {
                Log.e(TAG, "Cannot process JSON results", e);
            }
    
            return resultList;
        }
    

    i guess you have specified the list_item.xml as below.

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="wrap_content" android:layout_height="wrap_content" />
    

    try it out. Hope it will helps you.