Sunday, 17 July 2016

Google Autocomplete Places api Example


Hi here i'm giving you simple example about autocomplete, if you want you can try other from referring google api site. Just follow few steps. Hope this help you to understand and do your work easily

Step 1.
In you Activity you need to use edit text as text changed listener, then call places api


        et_Search.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {

            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                                          int after) {
                // TODO Auto-generated method stub
            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

                    placesTask = new PlacesTask();
                    String[] toPass = new String[2];
                    toPass[0] = s.toString();
                    placesTask.execute(toPass);

            }
        });

Step 2.
 here is calling for google places api

// Fetches all places from GooglePlaces AutoComplete Web Service
    private class PlacesTask extends AsyncTask<String, Void, String> {

        private String val = "";
        @Override
        protected String doInBackground(String... place) {
            // For storing data from web service
            String data = "";

            // Obtain browser key from https://code.google.com/apis/console
            String key = "key="+getResources().getString(R.string.google_server_key);

            String input="";

            try {
                input = "input=" + URLEncoder.encode(place[0], "utf-8");
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }

            String parameters = input+"&"+key + "&components=country:in";
            // Output format +gpsTracker.getLatitude() + "," + gpsTracker.getLongitude() + "&radius=20000
            String output = "json";

            // Building the url to the web service
            String url = "https://maps.googleapis.com/maps/api/place/autocomplete/"+output+"?"+parameters;

            try{
                // Fetching the data from we service
                data = Webservices.ApiCallGet(url);
            }catch(Exception e){
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            // Creating ParserTask
            parserTask = new ParserTask();

            String[] strData = new String[2];
            strData[0] = result;
            // Starting Parsing the JSON string returned by Web Service
            parserTask.execute(strData);
        }
    }

Step 3. Getting Result

    /** A class to parse the Google Places in JSON format */
    private class ParserTask extends AsyncTask<String, Integer, List<HashMap<String,String>>>{

        JSONObject jObject;

        @Override
        protected List<HashMap<String, String>> doInBackground(String... jsonData) {

            List<HashMap<String, String>> places = null;

            PlaceJSONParser placeJsonParser = new PlaceJSONParser();


            try{
                jObject = new JSONObject(jsonData[0]);

                // Getting the parsed data as a List construct
                places = placeJsonParser.parse(jObject);

            }catch(Exception e){
                Log.d("Exception",e.toString());
            }
            return places;
        }

        @Override
        protected void onPostExecute(List<HashMap<String, String>> result) {

            String[] from = new String[] { "description"};
            int[] to = new int[] { android.R.id.text1 };
                AutoCompleteAdapter adapter = new AutoCompleteAdapter(getBaseContext(), result);

                // Setting the adapter
                if(adapter != null && result != null )
                    lv_SearchList.setAdapter(adapter);

        }
    }

    // Fetches  latitude & longitude from place id
    private class LatLongTask extends AsyncTask<Void, Void, String> {

        private HashMap<String, String> placeMap;
        private ProgressDialog dialog;

        public LatLongTask(HashMap<String, String> placeMap){
            this.placeMap = placeMap;
        }


        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog = ProgressDialog.show(SearchActivity.this, "", "Please Wait...",
                    true, false);
        }

        @Override
        protected String doInBackground(Void... place) {
            // For storing data from web service
            String data = "";

            // Obtain browser key from https://code.google.com/apis/console
            String key = "key="+getResources().getString(R.string.google_server_key);

            String input="";

            try {
                input = "placeid=" + URLEncoder.encode(placeMap.get("place_id"), "utf-8");
            } catch (UnsupportedEncodingException e1) {
                e1.printStackTrace();
            }

            // Building the parameters to the web service
            String parameters = input+"&"+key ;

            // Output format
            String output = "json";

            // Building the url to the web service
            String url = "https://maps.googleapis.com/maps/api/place/details/"+output+"?"+parameters;

            try{
                // Fetching the data from we service
                data = Webservices.ApiCallGet(url);
            }catch(Exception e){
                Log.d("Background Task", e.toString());
            }
            return data;
        }

        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            if(dialog!= null && dialog.isShowing()){
                dialog.dismiss();
            }

            try {
                JSONObject jResult = new JSONObject(result);
                if(jResult.getString("status").equals("OK")) {
                    JSONObject jsonObject = jResult.getJSONObject("result");
                    JSONObject jGeometry = jsonObject.getJSONObject("geometry");
                    JSONObject jLocation = jGeometry.getJSONObject("location");
                    placeMap.put("lat", ""+jLocation.getString("lat"));
                    placeMap.put("lng", ""+jLocation.getString("lng"));
                    ArrayList<HashMap<String, String>> mapArrayList = new ArrayList<HashMap<String, String>>();
                    mapArrayList.add(placeMap);
                    Intent intent = new Intent();
                    intent.putExtra("result",  mapArrayList);
                    if (getParent() == null) {
                        setResult(Activity.RESULT_OK, intent);
                    } else {
                        getParent().setResult(Activity.RESULT_OK, intent);
                    }
                    finish();
                }else{
                    Utils.toastmessage(SearchActivity.this, "Please try again later.");
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }


        }
    }


Step 4. create this class


public class PlaceJSONParser {

    /** Receives a JSONObject and returns a list */
    public List<HashMap<String,String>> parse(JSONObject jObject){

        JSONArray jPlaces = null;
        try {
            /** Retrieves all the elements in the 'places' array */
            jPlaces = jObject.getJSONArray("predictions");
        } catch (JSONException e) {
            e.printStackTrace();
        }
        /** Invoking getPlaces with the array of json object
         * where each json object represent a place
         */
        return getPlaces(jPlaces);
    }

    private List<HashMap<String, String>> getPlaces(JSONArray jPlaces){
        int placesCount = jPlaces.length();
        List<HashMap<String, String>> placesList = new ArrayList<HashMap<String,String>>();
        HashMap<String, String> place = null;

        /** Taking each place, parses and adds to list object */
        for(int i=0; i<placesCount;i++){
            try {
                /** Call getPlace with place JSON object to parse the place */
                place = getPlace((JSONObject)jPlaces.get(i));
                placesList.add(place);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        return placesList;
    }

    /** Parsing the Place JSON object */
    private HashMap<String, String> getPlace(JSONObject jPlace){

        HashMap<String, String> place = new HashMap<String, String>();

        String id="";
        String reference="";
        String description="";
        String place_id = "";

        try {

            description = jPlace.getString("description");
            id = jPlace.getString("id");
            reference = jPlace.getString("reference");
            place_id = jPlace.getString("place_id");

            place.put("description", description);
            place.put("_id",id);
            place.put("reference",reference);
            place.put("place_id", place_id);

        } catch (JSONException e) {
            e.printStackTrace();
        }
        return place;
    }


}

No comments:

Post a Comment