Issue in draw route with waypoints with passing origin and destination address android

789 views Asked by At

Hello friends i want to draw route with origin and destination address including waypoints in android below is my code

String url="https://maps.googleapis.com/maps/api/directions/json?origin=Toronto&destination=Mississauga&waypoints=2970%20Drew%20Rd,%20Suite%20211%20Mississauga%20L4T%200A6%20Ontario%20Canada|6665%20Tomken%20Road,%20Suite%20201%20Mississauga%20L5T%202C4%20Ontario%20Canada";

    DownloadTask downloadTask = new DownloadTask();
    downloadTask.execute(url);


private class DownloadTask extends AsyncTask<String, Void, String>{         

// Downloading data in non-ui thread
@Override
protected String doInBackground(String... url) {

    // For storing data from web service
    String data = "";

    try{
        // Fetching the data from web service
        data = downloadUrl(url[0]);
    }catch(Exception e){
        Log.d("Background Task",e.toString());
    }
    return data;        
}

// Executes in UI thread, after the execution of
// doInBackground()
@Override
protected void onPostExecute(String result) {           
    super.onPostExecute(result);            

    ParserTask parserTask = new ParserTask();

    // Invokes the thread for parsing the JSON data
    parserTask.execute(result);

}       

}

private class ParserTask extends AsyncTask<String, Integer, List<List<HashMap<String,String>>> >{

// Parsing the data in non-ui thread        
@Override
protected List<List<HashMap<String, String>>> doInBackground(String... jsonData) {

    JSONObject jObject; 
    List<List<HashMap<String, String>>> routes = null;                     

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

        // Starts parsing data
        routes = parser.parse(jObject);    
    }catch(Exception e){
        e.printStackTrace();
    }
    return routes;
}

// Executes in UI thread, after the parsing process
@Override
protected void onPostExecute(List<List<HashMap<String, String>>> result) {

    ArrayList<LatLng> points = null;
    PolylineOptions lineOptions = null;

    // Traversing through all the routes
    for(int i=0;i<result.size();i++){
        points = new ArrayList<LatLng>();
        lineOptions = new PolylineOptions();

        // Fetching i-th route
        List<HashMap<String, String>> path = result.get(i);

        // Fetching all the points in i-th route
        for(int j=0;j<path.size();j++){
            HashMap<String,String> point = path.get(j);                 

            double lat = Double.parseDouble(point.get("lat"));
            double lng = Double.parseDouble(point.get("lng"));
            LatLng position = new LatLng(lat, lng); 

            points.add(position);                       
        }

        // Adding all the points in the route to LineOptions
        lineOptions.addAll(points);
        lineOptions.width(2);
        lineOptions.color(Color.RED);               
    }

    // Drawing polyline in the Google Map for the i-th route
    myMap.addPolyline(lineOptions);                         
}           

}

private String downloadUrl(String strUrl) throws IOException{
 String data = "";
 InputStream iStream = null;
 HttpURLConnection urlConnection = null;
 try{
         URL url = new URL(strUrl);

         System.out.println("Download "+url);
         // Creating an http connection to communicate with url 
         urlConnection = (HttpURLConnection) url.openConnection();

         // Connecting to url 
         urlConnection.connect();

         // Reading data from url 
         iStream = urlConnection.getInputStream();

         BufferedReader br = new BufferedReader(new InputStreamReader(iStream));

         StringBuffer sb  = new StringBuffer();

         String line = "";
         while( ( line = br.readLine())  != null){
                 sb.append(line);
         }

         data = sb.toString();

         br.close();

 }catch(Exception e){
         Log.d("Exception while downloading url", e.toString());
 }finally{
         iStream.close();
         urlConnection.disconnect();
 }
 return data;

}

DirectionsJSONParser.java

public class DirectionsJSONParser {


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

    List<List<HashMap<String, String>>> routes = new ArrayList<List<HashMap<String,String>>>();
    JSONArray jRoutes = null;
    JSONArray jLegs = null;
    JSONArray jSteps = null;    

    try {

        jRoutes = jObject.getJSONArray("routes");

        /** Traversing all routes */
        for(int i=0;i<jRoutes.length();i++){        
            jLegs = ( (JSONObject)jRoutes.get(i)).getJSONArray("legs");
            List path = new ArrayList<HashMap<String, String>>();

            /** Traversing all legs */
            for(int j=0;j<jLegs.length();j++){
                jSteps = ( (JSONObject)jLegs.get(j)).getJSONArray("steps");

                /** Traversing all steps */
                for(int k=0;k<jSteps.length();k++){
                    String polyline = "";
                    polyline = (String)((JSONObject)((JSONObject)jSteps.get(k)).get("polyline")).get("points");
                    List<LatLng> list = decodePoly(polyline);

                    /** Traversing all points */
                    for(int l=0;l<list.size();l++){
                        HashMap<String, String> hm = new HashMap<String, String>();
                        hm.put("lat", Double.toString(((LatLng)list.get(l)).latitude) );
                        hm.put("lng", Double.toString(((LatLng)list.get(l)).longitude) );
                        path.add(hm);                       
                    }                               
                }
                routes.add(path);
            }
        }

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


    return routes;
}   


/**
 * Method to decode polyline points 
 * Courtesy : jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java 
 * */
private List<LatLng> decodePoly(String encoded) {

    List<LatLng> poly = new ArrayList<LatLng>();
    int index = 0, len = encoded.length();
    int lat = 0, lng = 0;

    while (index < len) {
        int b, shift = 0, result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lat += dlat;

        shift = 0;
        result = 0;
        do {
            b = encoded.charAt(index++) - 63;
            result |= (b & 0x1f) << shift;
            shift += 5;
        } while (b >= 0x20);
        int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1));
        lng += dlng;

        LatLng p = new LatLng((((double) lat / 1E5)),
                (((double) lng / 1E5)));
        poly.add(p);
    }

    return poly;
}

}

and i also get catch error like

11-27 15:04:47.794: D/Exception while downloading url(12797): java.io.FileNotFoundException: https://maps.googleapis.com/maps/api/directions/json?origin=Toronto&destination=Mississauga&sensor=false&waypoints=2970 Drew Rd, Suite 211 Mississauga L4T 0A6 Ontario Canada|6665 Tomken Road, Suite 201 Mississauga L5T 2C4 Ontario Canada

in downloadUrl(String strUrl) function

any idea how can i solve it ?

0

There are 0 answers