0

In android Google Map , I want to draw a path between two places.

When Iam Using Hardcoded latitude and Longitude Showing Perfectly.

Problem-1

But Latitude and Longitude Getting from other Intent Showing Blue Screen in Map

Then closing that page again opening its Showing path Between Two Points.

Problem-2

then Iam Changing the Latitude and longitude of Both Locations its Showing Previous Location Path.

Here Latitute and Longitude values Iam getting from Previous intent.

How to resolve it. I Have Added my Code

MainActivity .java

    public class MainActivity extends FragmentActivity implements OnInfoWindowClickListener{


        public double Latitude1_Current_double,Longitutde1_Current_double,Latitude1_Center_double,Longitude1_Center_double;

         private int zoomLevel = 11;

         LatLng origin1 = new LatLng(Latitude1_Current_double, Longitutde1_Current_double);
            LatLng dest1 = new LatLng(Latitude1_Service_double,Longitude1_Service_double);

            double lat1=Latitude1_Current_double;
            double lang1=Longitutde1_Current_double;
            double lat2=Latitude1_Center_double;
            double lang2=Longitude1_Center_double;


            GoogleMap map;
            ArrayList<LatLng> markerPoints;

             /*private int zoomLevel1 = 14;
             private int zoomLevel2 = 11;*/

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);

            Bundle extras = getIntent().getExtras();


            String Latitude1_Current_String=extras.getString("STRING_I_NEED_LATITUDE_Current");
            String Longitutde1_Current_String =extras.getString("STRING_I_NEED_LONGITUDE_Current");
            String Latitude1_ServiceCenter_String =extras.getString("STRING_I_NEED_LATITUDE_ServiceCenter");
            String Longitude1_ServiceCenter_String =extras.getString("STRING_I_NEED_LONGITUDE_ServiceCenter");

                Latitude1_Current_double = Double.parseDouble(Latitude1_Current_String);
                Longitutde1_Current_double = Double.parseDouble(Longitutde1_Current_String);
                Latitude1_ServiceCenter_double = Double.parseDouble(Latitude1_ServiceCenter_String);
                Longitude1_ServiceCenter_double = Double.parseDouble(Longitude1_ServiceCenter_String);


            Toast.makeText(getApplicationContext(), "Get Direction"+Latitude1_Current_double+","+Longitutde1_Current_double+
                    Latitude1_Center_double+","+Longitude1_Center_double,Toast.LENGTH_SHORT).show();



            // Initializing 
            markerPoints = new ArrayList<LatLng>();

            // Getting reference to SupportMapFragment of the activity_main
            SupportMapFragment fm = (SupportMapFragment)getSupportFragmentManager().findFragmentById(R.id.map);

            // Getting reference to Button
        //  Button btnDraw = (Button)findViewById(R.id.btn_draw);       

            // Getting Map for the SupportMapFragment
            map = fm.getMap();

            // Enable MyLocation Button in the Map
            map.setMyLocationEnabled(true);     



             map.addMarker(new MarkerOptions().position(origin1)
                     .title("User Current Location")
                     .snippet("LatLng"+"("+lat1+","+lang1+")")
                     .icon(BitmapDescriptorFactory
                        .defaultMarker(BitmapDescriptorFactory.HUE_GREEN)));

             map.addMarker(new MarkerOptions().position(dest1)
                     .title("Service Center Destination Location")
                     .snippet("LatLng"+"("+lat2+","+lang2+")")
                     .icon(BitmapDescriptorFactory
                      .defaultMarker(BitmapDescriptorFactory.HUE_RED)));


            map.moveCamera(CameraUpdateFactory.newLatLngZoom(origin1, zoomLevel));
            map.moveCamera(CameraUpdateFactory.newLatLngZoom(dest1, zoomLevel));

            markerPoints.add(origin1);
            markerPoints.add(dest1);


            // Getting URL to the Google Directions API
            String url = getDirectionsUrl(origin1, dest1);              

            DownloadTask downloadTask = new DownloadTask();

            // Start downloading json data from Google Directions API
            downloadTask.execute(url);




            // The map will be cleared on long click
            map.setOnMapLongClickListener(new OnMapLongClickListener() {

                @Override
                public void onMapLongClick(LatLng point) {
                    // Removes all the points from Google Map
                    map.clear();

                    // Removes all the points in the ArrayList
                    markerPoints.clear();

                }
            });




        }

        private String getDirectionsUrl(LatLng origin,LatLng dest){

            // Origin of route
            String str_origin = "origin="+origin.latitude+","+origin.longitude;

            // Destination of route
            String str_dest = "destination="+dest.latitude+","+dest.longitude;      

            // Sensor enabled
            String sensor = "sensor=false";         

            // Waypoints
            String waypoints = "";

            for(int i=2;i<markerPoints.size();i++)
            {
                LatLng point  = (LatLng) markerPoints.get(i);
                if(i==2)
                waypoints = "waypoints=";
                waypoints += point.latitude + "," + point.longitude + "|";
            }


            // Building the parameters to the web service
            String parameters = str_origin+"&"+str_dest+"&"+sensor+"&"+waypoints;

            // Output format
            String output = "json";

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


            return url;
        }

        /** A method to download json data from url */
        private String downloadUrl(String strUrl) throws IOException{
            String data = "";
            InputStream iStream = null;
            HttpURLConnection urlConnection = null;
            try{
                    URL url = new URL(strUrl);

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



        // Fetches data from url passed
        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);            

                try
                {
                ParserTask parserTask = new ParserTask();

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

            } 
            catch (Exception e)
            {
                e.printStackTrace();
                Log.i("Exceptoin in DownloadTask onPostExecute", "Errroor");
            }

            }       
        }

        /** A class to parse the Google Places in JSON format */
        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)
            {

                try
                {

                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(5);
                    lineOptions.color(Color.BLUE);              
                }

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

            } 
            catch (Exception e)
            {
                e.printStackTrace();
                Log.i("Exceptoin in  parsing process onPostExecute", "Errroor");
            }

            }           
        }   


        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }

        @Override
        public void onInfoWindowClick(Marker marker)
        {

            Intent intent = new Intent(this, NewActivity.class);
            intent.putExtra("snippet", marker.getSnippet());
            intent.putExtra("title", marker.getTitle());
            intent.putExtra("position", marker.getPosition());
            startActivity(intent);

        }   
    }

DirectionsJSONParser.java

import com.google.android.gms.maps.model.LatLng;

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;
    }
}
ManojKumar
  • 15
  • 7
  • 1
    hi, the question is not completely clear, what is the problem? You don't know how to draw a path (Polyline) or you have problem when sending intents? How do you send and receive intents? Please share some code! – N Dorigatti Jun 04 '15 at 12:54
  • iam Getting the latittude and logitude Values from Other Intent Working Fine – ManojKumar Jun 04 '15 at 13:00
  • I Have Added my code – ManojKumar Jun 04 '15 at 13:16
  • What is Latitude1_Service_double,Longitude1_Service_double? they are not declared anywhere – so_jin_ee Jun 04 '15 at 18:02
  • 1
    This does not seem like a google map issue but rather intent not passing correct lat/lng information. The blue screen is probably caused by lat/long = (0,0) and your marker is on the ocean with a zoom. When I zoom out I see land. Make sure you are getting the correct lat/lng before you set your markers. – so_jin_ee Jun 04 '15 at 18:19
  • I think the position you are passing are lat = 0.0, lng = 0.0. Thats why its showing blue, as this puts the focus on the ocean. please check if the latitude and longitude are not 0.0 – Vikrant_Dev Jun 05 '15 at 11:31
  • its not ocean, first time only blue screen, then showing the path again return back to map – ManojKumar Jun 05 '15 at 11:34

1 Answers1

3

Figured out your problem:

    public double Latitude1_Current_double,Longitutde1_Current_double,Latitude1_Center_double,Longitude1_Center_double;

 private int zoomLevel = 11;

 LatLng origin1 = new LatLng(Latitude1_Current_double, Longitutde1_Current_double);
    LatLng dest1 = new LatLng(Latitude1_Service_double,Longitude1_Service_double);

    double lat1=Latitude1_Current_double;
    double lang1=Longitutde1_Current_double;
    double lat2=Latitude1_Center_double;
    double lang2=Longitude1_Center_double;

The variables origin1 and dest1 does not change even if you change lat1 and lang1, so map.addMarker(new MarkerOptions().position(origin1) will have origin1 =(0,0) the default value. You need to make sure that variables origin1 and dest1 are modified inside onCreate method so your markers does not placed in the middle of the ocean. Hope this clarifies. I've tested your code and as soon as I put origin1 and dest1 the correct lat/lng info in onCreate method, I've got desired result.

so_jin_ee
  • 802
  • 6
  • 7
  • I have edited my code , Getting the Latitude and longitude values from other Intent, Now How to resolve it. First time showing blue screen . then Showing Correct direction. – ManojKumar Jun 05 '15 at 10:19
  • then if Again Changing the latitude and longitude its showing previous path. how to fix it – ManojKumar Jun 05 '15 at 10:20
  • if i am using the hard coded latitude and longitude values, instead of other intent values working fine. but using other intent values ,iam getting above mentioned problem – ManojKumar Jun 05 '15 at 10:26
  • no, put LatLng origin1 = new LatLng(Latitude1_Current_double, Longitutde1_Current_double); LatLng dest1 = new LatLng(Latitude1_Service_double,Longitude1_Service_double); inside onCreate method after you receive your values. You have origin1 and dest1 = (0,0) unless you put them after you get the values. – so_jin_ee Jun 05 '15 at 16:54
  • I tested your code... It works perfectly fine for me when I put the declaration of dest1 and origin1 after I assign lat1,lang1,lat2,lang2... – so_jin_ee Jun 05 '15 at 16:55
  • @so_jin_ee please look at http://stackoverflow.com/questions/40086860/receiving-ambiguous-sky-screen-while-loading-google-map/40132351#40132351 – Hardik Mehta Oct 24 '16 at 13:07