2012-07-30 85 views
0

我是新的android和我测试的应用程序,提供了在android 道路的路径但我在这里有很多错误(如下图所示)可以anyOne可以帮助我??? 我会很感激..在android的路径

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

class MapOverlay extends com.google.android.maps.Overlay { 
     Road mRoad; 
     ArrayList<GeoPoint> mPoints; 

     public MapOverlay(Road road, MapView mv) { 
       mRoad = road; 
       if (road.mRoute.length > 0) { 
         mPoints = new ArrayList<GeoPoint>(); 
         for (int i = 0; i < road.mRoute.length; i++) { 
           mPoints.add(new GeoPoint((int) (road.mRoute[i][1] * 1000000), 
               (int) (road.mRoute[i][0] * 1000000))); 
         } 
         int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
             mPoints.size() - 1).getLatitudeE6() - mPoints.get(0) 
             .getLatitudeE6())/2); 
         int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
             mPoints.size() - 1).getLongitudeE6() - mPoints.get(0) 
             .getLongitudeE6())/2); 
         GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong); 

         MapController mapController = mv.getController(); 
         mapController.animateTo(moveTo); 
         mapController.setZoom(7); 
       } 
     } 

     @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 x1 = -1, y1 = -1, x2 = -1, y2 = -1; 
       Paint paint = new Paint(); 
       paint.setColor(Color.GREEN); 
       paint.setStyle(Paint.Style.STROKE); 
       paint.setStrokeWidth(3); 
       for (int i = 0; i < mPoints.size(); i++) { 
         Point point = new Point(); 
         mv.getProjection().toPixels(mPoints.get(i), point); 
         x2 = point.x; 
         y2 = point.y; 
         if (i > 0) { 
           canvas.drawLine(x1, y1, x2, y2, paint); 
         } 
         x1 = x2; 
         y1 = y2; 
       } 
     } 
} 

,而我的午餐这个代码我有所有这些错误,如波纹管:

07-30 14:03:08.969: W/dalvikvm(6934): Unable to resolve superclass of Lcom/test/MapRouteActivity; (17) 
07-30 14:03:08.969: W/dalvikvm(6934): Link of class 'Lcom/test/MapRouteActivity;' failed 
07-30 14:03:08.969: W/dalvikvm(6934): threadid=1: thread exiting with uncaught exception (group=0x2aac87c8) 
07-30 14:03:08.979: E/AndroidRuntime(6934): FATAL EXCEPTION: main 
07-30 14:03:08.979: E/AndroidRuntime(6934): java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.test/com.test.MapRouteActivity}: java.lang.ClassNotFoundException: com.test.MapRouteActivity in loader dalvik.system.PathClassLoader[/data/app/com.test-1.apk] 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2585) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.os.Handler.dispatchMessage(Handler.java:99) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.os.Looper.loop(Looper.java:123) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at java.lang.reflect.Method.invokeNative(Native Method) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at java.lang.reflect.Method.invoke(Method.java:521) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at dalvik.system.NativeStart.main(Native Method) 
07-30 14:03:08.979: E/AndroidRuntime(6934): Caused by: java.lang.ClassNotFoundException: com.test.MapRouteActivity in loader dalvik.system.PathClassLoader[/data/app/com.test-1.apk] 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at dalvik.system.PathClassLoader.findClass(PathClassLoader.java:243) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at java.lang.ClassLoader.loadClass(ClassLoader.java:573) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at java.lang.ClassLoader.loadClass(ClassLoader.java:532) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.app.Instrumentation.newActivity(Instrumentation.java:1021) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2577) 
07-30 14:03:08.979: E/AndroidRuntime(6934):  ... 11 more 

回答

1

使用以下下面代码片段

private List<Overlay> mapOverlays; 

private Projection projection; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.main); 

linearLayout = (LinearLayout) findViewById(R.id.zoomview); 
mapView = (MapView) findViewById(R.id.mapview); 
mapView.setBuiltInZoomControls(true); 

mapOverlays = mapView.getOverlays();   
projection = mapView.getProjection(); 
mapOverlays.add(new MyOverlay());   

} 

@Override 
protected boolean isRouteDisplayed() { 
return false; 

} 

class MyOverlay extends Overlay{ 

public MyOverlay(){ 

} 

public void draw(Canvas canvas, MapView mapv, boolean shadow){ 
super.draw(canvas, mapv, shadow); 

Paint mPaint = new Paint(); 
mPaint.setDither(true); 
mPaint.setColor(Color.RED); 
mPaint.setStyle(Paint.Style.FILL_AND_STROKE); 
mPaint.setStrokeJoin(Paint.Join.ROUND); 
mPaint.setStrokeCap(Paint.Cap.ROUND); 
mPaint.setStrokeWidth(2); 

GeoPoint gP1 = new GeoPoint(19240000,-99120000); 
GeoPoint gP2 = new GeoPoint(37423157, -122085008); 

Point p1 = new Point(); 
Point p2 = new Point(); 
Path path = new Path(); 

projection.toPixels(gP1, p1); 
projection.toPixels(gP2, p2); 

path.moveTo(p2.x, p2.y); 
path.lineTo(p1.x,p1.y); 

canvas.drawPath(path, mPaint); 
} 
0

使用Draw Route Path的代码。

MainActivity.java

public class MainActivity 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, 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; 
    } 
} 

class MapOverlay extends com.google.android.maps.Overlay { 
    Road mRoad; 
    ArrayList<GeoPoint> mPoints; 

    public MapOverlay(Road road, MapView mv) { 
     mRoad = road; 
     if (road.mRoute.length > 0) { 
      mPoints = new ArrayList<GeoPoint>(); 
      for (int i = 0; i < road.mRoute.length; i++) { 
       mPoints.add(new GeoPoint((int) (road.mRoute[i][1] * 1000000), 
         (int) (road.mRoute[i][0] * 1000000))); 
      } 
      int moveToLat = (mPoints.get(0).getLatitudeE6() + (mPoints.get(
        mPoints.size() - 1).getLatitudeE6() - mPoints.get(0) 
        .getLatitudeE6())/2); 
      int moveToLong = (mPoints.get(0).getLongitudeE6() + (mPoints.get(
        mPoints.size() - 1).getLongitudeE6() - mPoints.get(0) 
        .getLongitudeE6())/2); 
      GeoPoint moveTo = new GeoPoint(moveToLat, moveToLong); 

      MapController mapController = mv.getController(); 
      mapController.animateTo(moveTo); 
      mapController.setZoom(7); 
     } 
    } 

    @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 x1 = -1, y1 = -1, x2 = -1, y2 = -1; 
     Paint paint = new Paint(); 
     paint.setColor(Color.GREEN); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeWidth(3); 
     for (int i = 0; i < mPoints.size(); i++) { 
      Point point = new Point(); 
      mv.getProjection().toPixels(mPoints.get(i), point); 
      x2 = point.x; 
      y2 = point.y; 
      if (i > 0) { 
       canvas.drawLine(x1, y1, x2, y2, paint); 
      } 
      x1 = x2; 
      y1 = y2; 
     } 
    } 
} 

添加下列类

Point.java

public class Point { 
    String mName; 
    String mDescription; 
    String mIconUrl; 
    double mLatitude; 
    double mLongitude; 
} 

Road.java

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[] {}; 
} 

RoadProvider.java

public class RoadProvider { 

    public static Road getRoute(InputStream is) { 
     KMLHandler handler = new KMLHandler(); 
     try { 
      SAXParser parser = SAXParserFactory.newInstance().newSAXParser(); 
      parser.parse(is, handler); 
     } catch (ParserConfigurationException e) { 
      e.printStackTrace(); 
     } catch (SAXException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
     return handler.mRoad; 
    } 

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

class KMLHandler extends DefaultHandler { 
    Road mRoad; 
    boolean isPlacemark; 
    boolean isRoute; 
    boolean isItemIcon; 
    private Stack<String> mCurrentElement = new Stack<String>(); 
    private String mString; 

    public KMLHandler() { 
     mRoad = new Road(); 
    } 

    public void startElement(String uri, String localName, String name, 
      Attributes attributes) throws SAXException { 
     mCurrentElement.push(localName); 
     if (localName.equalsIgnoreCase("Placemark")) { 
      isPlacemark = true; 
      mRoad.mPoints = addPoint(mRoad.mPoints); 
     } else if (localName.equalsIgnoreCase("ItemIcon")) { 
      if (isPlacemark) 
       isItemIcon = true; 
     } 
     mString = new String(); 
    } 

    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     String chars = new String(ch, start, length).trim(); 
     mString = mString.concat(chars); 
    } 

    public void endElement(String uri, String localName, String name) 
      throws SAXException { 
     if (mString.length() > 0) { 
      if (localName.equalsIgnoreCase("name")) { 
       if (isPlacemark) { 
        isRoute = mString.equalsIgnoreCase("Route"); 
        if (!isRoute) { 
         mRoad.mPoints[mRoad.mPoints.length - 1].mName = mString; 
        } 
       } else { 
        mRoad.mName = mString; 
       } 
      } else if (localName.equalsIgnoreCase("color") && !isPlacemark) { 
       mRoad.mColor = Integer.parseInt(mString, 16); 
      } else if (localName.equalsIgnoreCase("width") && !isPlacemark) { 
       mRoad.mWidth = Integer.parseInt(mString); 
      } else if (localName.equalsIgnoreCase("description")) { 
       if (isPlacemark) { 
        String description = cleanup(mString); 
        if (!isRoute) 
         mRoad.mPoints[mRoad.mPoints.length - 1].mDescription = description; 
        else 
         mRoad.mDescription = description; 
       } 
      } else if (localName.equalsIgnoreCase("href")) { 
       if (isItemIcon) { 
        mRoad.mPoints[mRoad.mPoints.length - 1].mIconUrl = mString; 
       } 
      } else if (localName.equalsIgnoreCase("coordinates")) { 
       if (isPlacemark) { 
        if (!isRoute) { 
         String[] xyParsed = split(mString, ","); 
         double lon = Double.parseDouble(xyParsed[0]); 
         double lat = Double.parseDouble(xyParsed[1]); 
         mRoad.mPoints[mRoad.mPoints.length - 1].mLatitude = lat; 
         mRoad.mPoints[mRoad.mPoints.length - 1].mLongitude = lon; 
        } else { 
         String[] coodrinatesParsed = split(mString, " "); 
         int lenNew = coodrinatesParsed.length; 
         int lenOld = mRoad.mRoute.length; 
         double[][] temp = new double[lenOld + lenNew][2]; 
         for (int i = 0; i < lenOld; i++) { 
          temp[i] = mRoad.mRoute[i]; 
         } 
         for (int i = 0; i < lenNew; i++) { 
          String[] xyParsed = split(coodrinatesParsed[i], ","); 
          for (int j = 0; j < 2 && j < xyParsed.length; j++) 
           temp[lenOld + i][j] = Double 
             .parseDouble(xyParsed[j]); 
         } 
         mRoad.mRoute = temp; 
        } 
       } 
      } 
     } 
     mCurrentElement.pop(); 
     if (localName.equalsIgnoreCase("Placemark")) { 
      isPlacemark = false; 
      if (isRoute) 
       isRoute = false; 
     } else if (localName.equalsIgnoreCase("ItemIcon")) { 
      if (isItemIcon) 
       isItemIcon = false; 
     } 
    } 

    private String cleanup(String value) { 
     String remove = "<br/>"; 
     int index = value.indexOf(remove); 
     if (index != -1) 
      value = value.substring(0, index); 
     remove = "&#160;"; 
     index = value.indexOf(remove); 
     int len = remove.length(); 
     while (index != -1) { 
      value = value.substring(0, index).concat(
        value.substring(index + len, value.length())); 
      index = value.indexOf(remove); 
     } 
     return value; 
    } 

    public Point[] addPoint(Point[] points) { 
     Point[] result = new Point[points.length + 1]; 
     for (int i = 0; i < points.length; i++) 
      result[i] = points[i]; 
     result[points.length] = new Point(); 
     return result; 
    } 

    private static String[] split(String strString, String strDelimiter) { 
     String[] strArray; 
     int iOccurrences = 0; 
     int iIndexOfInnerString = 0; 
     int iIndexOfDelimiter = 0; 
     int iCounter = 0; 
     if (strString == null) { 
      throw new IllegalArgumentException("Input string cannot be null."); 
     } 
     if (strDelimiter.length() <= 0 || strDelimiter == null) { 
      throw new IllegalArgumentException(
        "Delimeter cannot be null or empty."); 
     } 
     if (strString.startsWith(strDelimiter)) { 
      strString = strString.substring(strDelimiter.length()); 
     } 
     if (!strString.endsWith(strDelimiter)) { 
      strString += strDelimiter; 
     } 
     while ((iIndexOfDelimiter = strString.indexOf(strDelimiter, 
       iIndexOfInnerString)) != -1) { 
      iOccurrences += 1; 
      iIndexOfInnerString = iIndexOfDelimiter + strDelimiter.length(); 
     } 
     strArray = new String[iOccurrences]; 
     iIndexOfInnerString = 0; 
     iIndexOfDelimiter = 0; 
     while ((iIndexOfDelimiter = strString.indexOf(strDelimiter, 
       iIndexOfInnerString)) != -1) { 
      strArray[iCounter] = strString.substring(iIndexOfInnerString, 
        iIndexOfDelimiter); 
      iIndexOfInnerString = iIndexOfDelimiter + strDelimiter.length(); 
      iCounter += 1; 
     } 

     return strArray; 
    } 
} 

main.xml中

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:id="@+id/description" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" /> 

    <com.google.android.maps.MapView 
     android:id="@+id/mapview" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:apiKey="Your API Key" 
     android:clickable="true" /> 

</LinearLayout> 

添加以下权限到你的Android清单文件。

<uses-permission android:name="android.permission.INTERNET"/> 
+0

任何方式..我昨天测试了你的代码,但textView“描述”是“null null”,应用程序崩溃我能做什么? – 2012-07-31 09:10:42

+0

将minsdkversion更改为您的清单文件中的10到8。 – 2012-07-31 09:45:28

+0

我没有找到解决方案,我有'nullPointer Exacption',但我不知道从哪里',并由什么造成的 – 2012-07-31 12:13:20