Search code examples
androidgoogle-maps-android-api-2google-directions-api

How to make different routes selectable in google Maps in android?


I'm working on an app which uses lots of google maps interaction. In an activity i've show routes between two point. I want those routes to be selectable, as per the user's choice show please help me. Here i'm attatching the image of the activity :As you can see the paths

And here is the code of the activity shown above :

public class RouteActivity extends FragmentActivity {
private GoogleMap mMap; // Might be null if Google Play services APK is not available.
double sl1,sl2,el1,el2;
FrameLayout fl;
TextView distTextView,timeTextView;
String routeArray[];
List<LatLng> list;
List<Polyline> polylineList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_route);
    setUpMapIfNeeded();
    mMap.getUiSettings().setZoomControlsEnabled(true);
    polylineList=new ArrayList<Polyline>();
    fl=(FrameLayout)findViewById(R.id.frame_layout);
    distTextView=(TextView)findViewById(R.id.distance_textView);
    timeTextView=(TextView)findViewById(R.id.time_textView);
    String start = getIntent().getStringExtra("start");
    String end = getIntent().getStringExtra("end");
    Geocoder coder = new Geocoder(this);
    List<Address> address;
    try {
        address = coder.getFromLocationName(start, 5);
        if (address == null) {
        }
        Address location = address.get(0);
         sl1=location.getLatitude();
         sl2=location.getLongitude();
    } catch (IOException e) {
        e.printStackTrace();
    }
    try {
        address = coder.getFromLocationName(end, 5);
        if (address == null) {
        }
        Address location = address.get(0);
        el1=location.getLatitude();
        el2=location.getLongitude();
    } catch (IOException e) {
        e.printStackTrace();
    }

    BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.from);
    markers[0]=mMap.addMarker(new MarkerOptions().position(new LatLng(sl1, sl2)).title(start).icon(icon));
    markers[1]=mMap.addMarker(new MarkerOptions().position(new LatLng(el1, el2)).title(end).icon(icon));
    LatLngBounds.Builder builder = new LatLngBounds.Builder();
    for (Marker marker : markers) {
        builder.include(marker.getPosition());
    }
    LatLngBounds bounds = builder.build();

    CameraUpdate cu=CameraUpdateFactory.newLatLngBounds(bounds,500,500,0);
    mMap.moveCamera(cu);
    mMap.animateCamera(cu);
    String url=makeURL(sl1,sl2,el1,el2);
    Log.e("Generated URL ",url);
    new MyAsyncTask().execute(url);
    fl.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            finish();
        }
    });
    mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
        @Override
        public void onMapClick(LatLng latLng) {
            int x=0;
            for (Polyline polyline : polylineList)
            {
                for (LatLng polyCoords : polyline.getPoints()) {
                    float[] results = new float[1];
                    Location.distanceBetween(latLng.latitude, latLng.longitude,
                            polyCoords.latitude, polyCoords.longitude, results);


                    if (results[0] < 100) {
                        mMap.clear();
                        for(Polyline pl:polylineList)
                        {
                            if(pl!=polyline) {
                                mMap.addPolyline(new PolylineOptions().color(Color.GRAY).addAll(pl.getPoints()));
                                }
                            else if(pl==polyline)
                            {
                                mMap.addPolyline(new PolylineOptions()
                                        .color(Color.BLUE)
                                        .addAll(pl.getPoints()));
                            }
                        }





                    }


                }

            }
            Log.e("PolyLine ",polylineList.toString());



        }
    });


}

    @Override
protected void onResume() {
    super.onResume();

}

private void setUpMapIfNeeded() {
    // Do a null check to confirm that we have not already instantiated the map.
    if (mMap == null) {
        // Try to obtain the map from the SupportMapFragment.
        mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                .getMap();
        // Check if we were successful in obtaining the map.
        if (mMap != null) {
            setUpMap();
        }
    }
}

public class MyAsyncTask extends AsyncTask<String,Void,String> {
    ProgressDialog progressDialog;

    @Override
    protected void onPreExecute() {
        progressDialog=new ProgressDialog(RouteActivity.this);
        progressDialog.setMessage("Finding Route ...");
        progressDialog.setCancelable(false);
        progressDialog.setIndeterminate(false);

        progressDialog.show();
    }

    @Override
    protected String doInBackground(String... str) {
        ParserClass parser = new ParserClass();
        String json_str = parser.getJSON(str[0], 2000);
        Log.e("JSON Data", json_str);
        return json_str;
    }

    @Override
    protected void onPostExecute(String s) {
        try {
            progressDialog.dismiss();
            JSONObject  jsonRootObject = new JSONObject(s);
            JSONArray routeArray=jsonRootObject.getJSONArray("routes");
            Log.e("ROUTES ",routeArray.toString());
            for(int i=routeArray.length()-1;i>=0;i--) {
                JSONObject routes = routeArray.getJSONObject(i);
                JSONObject overviewPolylines = routes.getJSONObject("overview_polyline");
                JSONArray legs=routes.getJSONArray("legs");
                for(int j=0;j<legs.length();j++)
                {
                    JSONObject distObj=legs.getJSONObject(j);
                    JSONObject distance =distObj.getJSONObject("distance");
                    String dist=distance.getString("text");
                    JSONObject duration=distObj.getJSONObject("duration");
                    String time=duration.getString("text");
                    Log.e("Route"+i+" DISTANCE ",dist);
                    Log.e("Route"+i+" TIME ",time);
                    distTextView.setText("Distance   "+dist);
                    timeTextView.setText("Time    "+time);
                }
                String encodedString = overviewPolylines.getString("points");
                Log.e("Waypoint "+i,encodedString);
                 list = decodePoly(encodedString);
                Log.e("List "+i,list.toString());
                if(i==0) {
                    Polyline line = mMap.addPolyline(new PolylineOptions()
                                    .addAll(list)
                                    .width(12)
                                    .color(Color.BLUE)
                                    .geodesic(true)
                            );
                    Log.e("PolyLine ",line.toString());
                    polylineList.add(line);
                }
                else{
                    Polyline line = mMap.addPolyline(new PolylineOptions()
                                    .addAll(list)
                                    .width(12)
                                    .color(Color.DKGRAY)
                                    .geodesic(true)
                    );
                    polylineList.add(line);



                    Log.e("PolyLine ",line.toString());

                    }

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

        super.onPostExecute(s);
    }
}

private void setUpMap() {
    mMap.clear();
}
public void showMap(Double l1,Double l2,String str)
{
    LatLng position=new LatLng(l1,l2);
    SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);
    GoogleMap googleMap = fm.getMap();
    BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.from);
    mMap.addMarker(new MarkerOptions().position(new LatLng(l1, l2)).title(str).icon(icon));
    CameraUpdate updatePosition = CameraUpdateFactory.newLatLng(position);
    CameraUpdate updateZoom=CameraUpdateFactory.zoomTo(15);
    googleMap.moveCamera(updatePosition);
    googleMap.animateCamera(updateZoom);
}
public String makeURL (double sourcelat, double sourcelog, double destlat, double destlog ){
    StringBuilder urlString = new StringBuilder();
    urlString.append("https://maps.googleapis.com/maps/api/directions/json");
    urlString.append("?origin=");// from
    urlString.append(Double.toString(sourcelat));
    urlString.append(",");
    urlString.append(Double.toString( sourcelog));
    urlString.append("&destination=");// to
    urlString.append(Double.toString( destlat));
    urlString.append(",");
    urlString.append(Double.toString( destlog));
    urlString.append("&sensor=false&mode=driving&alternatives=true&units=imperial");
    urlString.append("&key=AIzaSyD5NOOpYKObjlZbt_-4CUOMi14mObzbGNo");
    return urlString.toString();
}

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;
}
}

In the abouce code i'm creating these paths using google directions api

Please help in selecting different routes. Thank you


Solution

  • Guys I've achieved the desired functionality, just made some changes in existing code and it's working now. Thanks for your guidance :)