ManojKumar
ManojKumar

Reputation: 15

Map Showing Blue Screen ,when drawing Path Between Two Places in Android

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

Upvotes: 0

Views: 714

Answers (1)

so_jin_ee
so_jin_ee

Reputation: 812

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.

Upvotes: 3

Related Questions