Java tutorial
/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package eu.guardiansystems.livesapp.android.ui; import android.content.Context; import android.os.AsyncTask; import android.util.Log; import java.io.InputStream; import java.util.ArrayList; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import org.apache.http.client.HttpClient; import org.apache.http.impl.client.DefaultHttpClient; import org.w3c.dom.Document; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import com.google.android.gms.maps.model.LatLng; import java.io.IOException; import java.net.URL; import java.util.concurrent.ExecutionException; import java.util.logging.Level; import java.util.logging.Logger; import javax.xml.parsers.ParserConfigurationException; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.methods.HttpGet; import org.apache.http.protocol.BasicHttpContext; import org.apache.http.protocol.HttpContext; import org.xml.sax.SAXException; public class GMapDirections { public final static String MODE_DRIVING = "driving"; public final static String MODE_WALKING = "walking"; private Context mContext; private Document mDocument; private class HttpGetter extends AsyncTask<String, Void, Document> { @Override protected Document doInBackground(String... urls) { // TODO Auto-generated method stub Document doc = null; HttpClient client = new DefaultHttpClient(); HttpGet httpGet = new HttpGet(urls[0]); try { DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); HttpResponse response = client.execute(httpGet); StatusLine statusLine = response.getStatusLine(); int statusCode = statusLine.getStatusCode(); if (statusCode == 200) { InputStream in = response.getEntity().getContent(); doc = builder.parse(in); } else { Log.e("Getter", "Failed to download file"); } } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (ParserConfigurationException e) { e.printStackTrace(); } catch (SAXException e) { e.printStackTrace(); } return doc; } } public GMapDirections(Context context) { mContext = context; } public Document refreshDocument(LatLng start, LatLng end, String mode) { try { String url = "http://maps.googleapis.com/maps/api/directions/xml?" + "origin=" + start.latitude + "," + start.longitude + "&destination=" + end.latitude + "," + end.longitude + "&sensor=false&units=metric&mode=" + mode; HttpGetter get = new HttpGetter(); get.execute(url); return get.get(); } catch (InterruptedException ex) { ex.printStackTrace(); } catch (ExecutionException ex) { ex.printStackTrace(); } return null; } public String getDurationText(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "text")); return node2.getTextContent(); } catch (Exception e) { return "0"; } } public int getDurationValue(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("duration"); Node node1 = nl1.item(0); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); return Integer.parseInt(node2.getTextContent()); } catch (Exception e) { return -1; } } public String getDistanceText(Document doc) { /* * while (en.hasMoreElements()) { type type = (type) en.nextElement(); * * } */ try { NodeList nl1; nl1 = doc.getElementsByTagName("distance"); Node node1 = nl1.item(nl1.getLength() - 1); NodeList nl2 = null; nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); return node2.getTextContent(); } catch (Exception e) { return "-1"; } /* * NodeList nl1; if(doc.getElementsByTagName("distance")!=null){ nl1= * doc.getElementsByTagName("distance"); * * Node node1 = nl1.item(nl1.getLength() - 1); NodeList nl2 = null; if * (node1.getChildNodes() != null) { nl2 = node1.getChildNodes(); Node * node2 = nl2.item(getNodeIndex(nl2, "value")); Log.d("DistanceText", * node2.getTextContent()); return node2.getTextContent(); } else return * "-1";} else return "-1"; */ } public int getDistanceValue(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = null; node1 = nl1.item(nl1.getLength() - 1); NodeList nl2 = node1.getChildNodes(); Node node2 = nl2.item(getNodeIndex(nl2, "value")); return Integer.parseInt(node2.getTextContent()); } catch (Exception e) { return -1; } /* * NodeList nl1 = doc.getElementsByTagName("distance"); Node node1 = * null; if (nl1.getLength() > 0) node1 = nl1.item(nl1.getLength() - 1); * if (node1 != null) { NodeList nl2 = node1.getChildNodes(); Node node2 * = nl2.item(getNodeIndex(nl2, "value")); Log.i("DistanceValue", * node2.getTextContent()); return * Integer.parseInt(node2.getTextContent()); } else return 0; */ } public String getStartAddress(Document doc) { try { NodeList nl1 = doc.getElementsByTagName("start_address"); Node node1 = nl1.item(0); return node1.getTextContent(); } catch (Exception e) { return "-1"; } } public String getEndAddress() { try { NodeList nl1 = mDocument.getElementsByTagName("end_address"); Node node1 = nl1.item(0); return node1.getTextContent(); } catch (Exception e) { return "-1"; } } public String getCopyRights() { try { NodeList nl1 = mDocument.getElementsByTagName("copyrights"); Node node1 = nl1.item(0); return node1.getTextContent(); } catch (Exception e) { return "-1"; } } public ArrayList<LatLng> getDirection(Document doc) { if (doc == null) return new ArrayList<LatLng>(); NodeList nl1, nl2, nl3; ArrayList<LatLng> listGeopoints = new ArrayList<LatLng>(); nl1 = doc.getElementsByTagName("step"); if (nl1.getLength() > 0) { for (int i = 0; i < nl1.getLength(); i++) { Node node1 = nl1.item(i); nl2 = node1.getChildNodes(); Node locationNode = nl2.item(getNodeIndex(nl2, "start_location")); nl3 = locationNode.getChildNodes(); Node latNode = nl3.item(getNodeIndex(nl3, "lat")); double lat = Double.parseDouble(latNode.getTextContent()); Node lngNode = nl3.item(getNodeIndex(nl3, "lng")); double lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng)); locationNode = nl2.item(getNodeIndex(nl2, "polyline")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "points")); ArrayList<LatLng> arr = decodePoly(latNode.getTextContent()); for (int j = 0; j < arr.size(); j++) { listGeopoints.add(new LatLng(arr.get(j).latitude, arr.get(j).longitude)); } locationNode = nl2.item(getNodeIndex(nl2, "end_location")); nl3 = locationNode.getChildNodes(); latNode = nl3.item(getNodeIndex(nl3, "lat")); lat = Double.parseDouble(latNode.getTextContent()); lngNode = nl3.item(getNodeIndex(nl3, "lng")); lng = Double.parseDouble(lngNode.getTextContent()); listGeopoints.add(new LatLng(lat, lng)); } } return listGeopoints; } private int getNodeIndex(NodeList nl, String nodename) { for (int i = 0; i < nl.getLength(); i++) { if (nl.item(i).getNodeName().equals(nodename)) { return i; } } return -1; } private ArrayList<LatLng> decodePoly(String encoded) { ArrayList<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 position = new LatLng((double) lat / 1E5, (double) lng / 1E5); poly.add(position); } return poly; } }