J2ME/Android/BlackBerry - driving directions, route between two locations J2ME/Android/BlackBerry - driving directions, route between two locations android android

J2ME/Android/BlackBerry - driving directions, route between two locations


J2ME Map Route Provider

maps.google.com has a navigation service which can provide you route information in KML format.

To get kml file we need to form url with start and destination locations:

public static String getUrl(double fromLat, double fromLon,                            double toLat, double toLon) {// connect to map web service    StringBuffer urlString = new StringBuffer();    urlString.append("http://maps.google.com/maps?f=d&hl=en");    urlString.append("&saddr=");// from    urlString.append(Double.toString(fromLat));    urlString.append(",");    urlString.append(Double.toString(fromLon));    urlString.append("&daddr=");// to    urlString.append(Double.toString(toLat));    urlString.append(",");    urlString.append(Double.toString(toLon));    urlString.append("&ie=UTF8&0&om=0&output=kml");    return urlString.toString();}

Next you will need to parse xml (implemented with SAXParser) and fill data structures:

public class Point {    String mName;    String mDescription;    String mIconUrl;    double mLatitude;    double mLongitude;}public class Road {    public String mName;    public String mDescription;    public int mColor;    public int mWidth;    public double[][] mRoute = new double[][] {};    public Point[] mPoints = new Point[] {};}

Network connection is implemented in different ways on Android and Blackberry, so you will have to first form url:

 public static String getUrl(double fromLat, double fromLon,     double toLat, double toLon)

then create connection with this url and get InputStream.
Then pass this InputStream and get parsed data structure:

 public static Road getRoute(InputStream is) 

Full source code RoadProvider.java

BlackBerry

class MapPathScreen extends MainScreen {    MapControl map;    Road mRoad = new Road();    public MapPathScreen() {        double fromLat = 49.85, fromLon = 24.016667;        double toLat = 50.45, toLon = 30.523333;        String url = RoadProvider.getUrl(fromLat, fromLon, toLat, toLon);        InputStream is = getConnection(url);        mRoad = RoadProvider.getRoute(is);        map = new MapControl();        add(new LabelField(mRoad.mName));        add(new LabelField(mRoad.mDescription));        add(map);    }    protected void onUiEngineAttached(boolean attached) {        super.onUiEngineAttached(attached);        if (attached) {            map.drawPath(mRoad);        }    }    private InputStream getConnection(String url) {        HttpConnection urlConnection = null;        InputStream is = null;        try {            urlConnection = (HttpConnection) Connector.open(url);            urlConnection.setRequestMethod("GET");            is = urlConnection.openInputStream();        } catch (IOException e) {            e.printStackTrace();        }        return is;    }}

See full code on J2MEMapRouteBlackBerryEx on Google Code

Android

Android G1 screenshot

public class MapRouteActivity extends MapActivity {    LinearLayout linearLayout;    MapView mapView;    private Road mRoad;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.main);        mapView = (MapView) findViewById(R.id.mapview);        mapView.setBuiltInZoomControls(true);        new Thread() {            @Override            public void run() {                double fromLat = 49.85, fromLon = 24.016667;                double toLat = 50.45, toLon = 30.523333;                String url = RoadProvider                        .getUrl(fromLat, fromLon, toLat, toLon);                InputStream is = getConnection(url);                mRoad = RoadProvider.getRoute(is);                mHandler.sendEmptyMessage(0);            }        }.start();    }    Handler mHandler = new Handler() {        public void handleMessage(android.os.Message msg) {            TextView textView = (TextView) findViewById(R.id.description);            textView.setText(mRoad.mName + " " + mRoad.mDescription);            MapOverlay mapOverlay = new MapOverlay(mRoad, mapView);            List<Overlay> listOfOverlays = mapView.getOverlays();            listOfOverlays.clear();            listOfOverlays.add(mapOverlay);            mapView.invalidate();        };    };    private InputStream getConnection(String url) {        InputStream is = null;        try {            URLConnection conn = new URL(url).openConnection();            is = conn.getInputStream();        } catch (MalformedURLException e) {            e.printStackTrace();        } catch (IOException e) {            e.printStackTrace();        }        return is;    }    @Override    protected boolean isRouteDisplayed() {        return false;    }}

See full code on J2MEMapRouteAndroidEx on Google Code