3

I am working on functionality where I send waypoints to Gmapsapp through Intent so that use can navigate to the destination by the custom waypoints that I send

I when I plot this route in my embedded Google Maps , I can see Circuit route , but when I see the same route in Gmapsapp , the Circuit is broken.

My code :

String srcAdd = "saddr="+latLngArrayList.get(0).latitude+","+latLngArrayList.get(0).longitude;
        String desAdd = "&daddr="+latLngArrayList.get(latLngArrayList.size() - 1).latitude+","+latLngArrayList.get(latLngArrayList.size() - 1).longitude;
        String wayPoints = "";

        for (int j = 1; j < latLngArrayList.size() - 1; ++j) {

            wayPoints =wayPoints+"+to:"+latLngArrayList.get(j).latitude+","+latLngArrayList.get(j).longitude;
        }

        String link="https://maps.google.com/maps?"+srcAdd+desAdd+wayPoints;
        final Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(link));
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");
        startActivity(intent);

circuit route enter image description here

no circuit route enter image description here

xomena
  • 31,125
  • 6
  • 88
  • 117
karthik kolanji
  • 2,044
  • 5
  • 20
  • 56
  • How do you construct a route in your app activity? Do you execute the Directions API request to get the polyline? Can you provide exact values of origin, destination and waypoints to reproduce the issue in Google Maps app? – xomena Oct 23 '17 at 13:58
  • Yes I use Direction API . – karthik kolanji Oct 23 '17 at 14:13
  • What about values for origin, destination and waypoints? I need them to reproduce the issue, otherwise I cannot help. – xomena Oct 23 '17 at 14:16
  • @xomena : This is the value https://maps.google.com/maps?saddr=19.07598304748535,72.87765502929688&daddr=19.07598304748535,72.87765502929688+to:18.7284,73.4815+to:18.6876,73.4827+to:18.5839587,73.5125092+to:18.5369444,73.4861111+to:18.480567,73.491658 – karthik kolanji Oct 24 '17 at 05:03

1 Answers1

9

I would suggest having a look at Google Maps URLs API that was launched in May 2017. This API provides universal cross-platform links that you can use in your applications to launch intents for Google Maps. One of the supported modes is directions mode. You can read about it here.

As you use Directions API and posted sample coordinates of waypoints, I was able to test the results in web service and in Google Maps URLs.

The web service results are tested in Directions calculator tool:

https://directionsdebug.firebaseapp.com/?origin=19.07598304748535%2C72.87765502929688&destination=19.07598304748535%2C72.87765502929688&waypoints=18.7284%2C73.4815%7C18.6876%2C73.4827%7C18.5839587%2C73.5125092%7C18.5369444%2C73.4861111%7C18.480567%2C73.491658

The route that we get via Directions API is the following:

enter image description here

The Google Maps URLs link for these waypoints is the following:

https://www.google.com/maps/dir/?api=1&origin=19.07598304748535,72.87765502929688&destination=19.07598304748535,72.87765502929688&waypoints=18.7284,73.4815%7C18.6876,73.4827%7C18.5839587,73.5125092%7C18.5369444,73.4861111%7C18.480567,73.491658&travelmode=driving

The route that you get using Google Maps URLs is shown in this screenshot.

enter image description here

As you can see both routes are the same, so Directions API and Google Maps URLs work as expected. I believe you should change your code for intents to use Google Maps URLs:

String srcAdd = "&origin=" + latLngArrayList.get(0).latitude + "," + latLngArrayList.get(0).longitude;  
String desAdd = "&destination=" + latLngArrayList.get(latLngArrayList.size() - 1).latitude + "," + latLngArrayList.get(latLngArrayList.size() - 1).longitude;
String wayPoints = "";  

for (int j = 1; j < latLngArrayList.size() - 1; j++) {
    wayPoints = wayPoints + (wayPoints.equals("") ? "" : "%7C") + latLngArrayList.get(j).latitude + "," + latLngArrayList.get(j).longitude;
}
wayPoints = "&waypoints=" + wayPoints; 

String link="https://www.google.com/maps/dir/?api=1&travelmode=driving"+srcAdd+desAdd+wayPoints;  
final Intent intent = new Intent(android.content.Intent.ACTION_VIEW, Uri.parse(link));  
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);  
intent.setClassName("com.google.android.apps.maps", "com.google.android.maps.MapsActivity");  
startActivity(intent);  

In addition you can use dir_action=navigate parameter in order to open turn-by-turn navigation directly.

karel
  • 5,489
  • 46
  • 45
  • 50
xomena
  • 31,125
  • 6
  • 88
  • 117
  • Thank you Sir for your answer. The route that is linked (formed circuit) is different from that I expect . I still don't understand y this happened?. Please see my circuit route image in post. – karthik kolanji Oct 24 '17 at 12:53
  • This is different indeed, but suggested route in Directions API may differ from day to day. Google takes into account traffic conditions and return the fastest route rather than shortest, so you can see different routes over time. This is expected. If you need exactly the same route add more waypoints to better control the output. You have directions calculator to play with routes and waypoints. – xomena Oct 24 '17 at 13:41
  • Sir , I tried a small hack of generating extra waypoints to create a desired circuit and that worked . Your answer helped me Sir . Thank u :) – karthik kolanji Oct 24 '17 at 13:57
  • How can we add options like Avoid Highways using the URL? – CopsOnRoad Feb 12 '18 at 07:37
  • I'm afraid Google Maps URLs doesn't support avoid option. You should use Directions API web service and draw polyline in Map view or Map fragment in order to achieve this. – xomena Feb 12 '18 at 07:45