0

Now i am working with a map class to show the direction between two places in map.But when i run this activity it shows a run time exception in logcat.And it specifies index outof bound exception somebody please help me to fix this. My activity class

public class CompassActivity extends MapActivity {
        MapView mv;

        MapController mc;

        Button Save, Cancel;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.car_finder_maplayout);
                MapView mv = (MapView)findViewById(R.id.carfinder_mapview);
                mv.setBuiltInZoomControls(true);
                MapController mc = mv.getController();
                ArrayList<GeoPoint> all_geo_points = getDirections(10.154929, 76.390316, 10.015861, 76.341867);
                GeoPoint moveTo = all_geo_points.get(0);
                mc.animateTo(moveTo);
                mc.setZoom(12);
                mv.getOverlays().add(new MyOverlay(all_geo_points));
        }

        public class MyOverlay extends Overlay {
                private ArrayList<GeoPoint> all_geo_points;

                public MyOverlay(ArrayList<GeoPoint> allGeoPoints) {
                        super();
                        this.all_geo_points = allGeoPoints;
                }

                @Override
                public boolean draw(Canvas canvas, MapView mv, boolean shadow, long when) {
                        super.draw(canvas, mv, shadow);
                        drawPath(mv, canvas);
                        return true;
                }

                public void drawPath(MapView mv, Canvas canvas) {
                        int xPrev = -1, yPrev = -1, xNow = -1, yNow = -1;
                        Paint paint = new Paint();
                        paint.setColor(Color.BLUE);
                        paint.setStyle(Paint.Style.FILL_AND_STROKE);
                        paint.setStrokeWidth(4);
                        paint.setAlpha(100);
                        if (all_geo_points != null) for (int i = 0; i < all_geo_points.size() - 4; i++) {
                                GeoPoint gp = all_geo_points.get(i);
                                Point point = new Point();
                                mv.getProjection().toPixels(gp, point);
                                xNow = point.x;
                                yNow = point.y;
                                if (xPrev != -1) {
                                        canvas.drawLine(xPrev, yPrev, xNow, yNow, paint);
                                }
                                xPrev = xNow;
                                yPrev = yNow;
                        }
                }
        }

        public static ArrayList<GeoPoint> getDirections(double lat1, double lon1, double lat2, double lon2) {
                String url = "http://maps.googleapis.com/maps/api/directions/xml?origin=" + lat1 + "," + lon1 + "&destination=" + lat2 + "," + lon2
                                + "&sensor=false&units=metric";
                String tag[] = {"lat", "lng"};
                ArrayList<GeoPoint> list_of_geopoints = new ArrayList<GeoPoint>();
                HttpResponse response = null;
                try {
                        HttpClient httpClient = new DefaultHttpClient();
                        HttpContext localContext = new BasicHttpContext();
                        HttpPost httpPost = new HttpPost(url);
                        response = httpClient.execute(httpPost, localContext);
                        InputStream in = response.getEntity().getContent();
                        DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
                        Document doc = builder.parse(in);
                        if (doc != null) {
                                NodeList nl1, nl2;
                                nl1 = doc.getElementsByTagName(tag[0]);
                                nl2 = doc.getElementsByTagName(tag[1]);
                                if (nl1.getLength() > 0) {
                                        list_of_geopoints = new ArrayList<GeoPoint>();
                                        for (int i = 0; i < nl1.getLength(); i++) {
                                                Node node1 = nl1.item(i);
                                                Node node2 = nl2.item(i);
                                                double lat = Double.parseDouble(node1.getTextContent());
                                                double lng = Double.parseDouble(node2.getTextContent());
                                                list_of_geopoints.add(new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)));
                                        }
                                } else {
                                        // No points found
                                }
                        }
                } catch (Exception e) {
                        e.printStackTrace();
                }
                return list_of_geopoints;
        }

        @Override
        protected boolean isRouteDisplayed() {
                // TODO Auto-generated method stub
                return true;
        }
}

logcat

03-01 14:40:08.758: E/AndroidRuntime(1890): FATAL EXCEPTION: main
03-01 14:40:08.758: E/AndroidRuntime(1890): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.kodspider.parkon/com.kodspider.parkon.CompassActivity}: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.startActivityNow(ActivityThread.java:1900)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.LocalActivityManager.moveToState(LocalActivityManager.java:135)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.LocalActivityManager.startActivity(LocalActivityManager.java:347)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabHost$IntentContentStrategy.getContentView(TabHost.java:694)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabHost.setCurrentTab(TabHost.java:358)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabHost$2.onTabSelectionChanged(TabHost.java:150)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.widget.TabWidget$TabClickListener.onClick(TabWidget.java:546)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.view.View.performClick(View.java:4084)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.view.View$PerformClick.run(View.java:16966)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.os.Handler.handleCallback(Handler.java:615)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.os.Looper.loop(Looper.java:137)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.main(ActivityThread.java:4745)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.lang.reflect.Method.invokeNative(Native Method)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.lang.reflect.Method.invoke(Method.java:511)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at dalvik.system.NativeStart.main(Native Method)
03-01 14:40:08.758: E/AndroidRuntime(1890): Caused by: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at java.util.ArrayList.get(ArrayList.java:304)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at com.kodspider.parkon.CompassActivity.onCreate(CompassActivity.java:43)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.Activity.performCreate(Activity.java:5008)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
03-01 14:40:08.758: E/AndroidRuntime(1890):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
03-01 14:40:08.758: E/AndroidRuntime(1890):     ... 18 more
Niko
  • 1,367
  • 1
  • 13
  • 37

2 Answers2

2

Your error is: java.lang.IndexOutOfBoundsException: Invalid index 0, size is 0

The crash is somewhere in the caller of your getDirections call. Now there is 1 locations which I spot can go terribly wrong:

GeoPoint moveTo = all_geo_points.get(0);

get(0) will crash if there are none in it ==> your error

Also (minor) the second creation of list_of_geopoints is not needed:

list_of_geopoints = new ArrayList<GeoPoint>();
RvdK
  • 19,580
  • 4
  • 64
  • 107
0

Your getDirections(10.154929, 76.390316, 10.015861, 76.341867) most likely doesn't return any points. You are getting an empty array and try to read the first element. This method should be debugged to see why it doesn't get any result.

To avoid the crash for any calls done for routes that don't return points you should do like this:

if (all_geo_points != null && all_geo_points.size() > 0) {
    GeoPoint moveTo = all_geo_points.get(0);
    mc.animateTo(moveTo);
    mc.setZoom(12);
    mv.getOverlays().add(new MyOverlay(all_geo_points));
}
azertiti
  • 3,150
  • 17
  • 19