2011-02-16 49 views
1

我已经得到了以下代码,但我的gps没有获取当前位置,向我显示了触摸地址和覆盖图。我得到了0.0的经度和纬度。基本上只有地图显示出来。非常感谢帮助。谢谢!Android Map with current location

公共类地图扩展MapActivity {

MapView mapView; 
MapController mc; 
GeoPoint p; 
private LocationManager lm; 
private LocationListener locationListener; 
Button btn_send; 
int lat, lng; 


class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean draw(Canvas canvas, MapView mapView, 
    boolean shadow, long when) 
    { 
     super.draw(canvas, mapView, shadow);     

     //---translate the GeoPoint to screen pixels--- 
     Point screenPts = new Point(); 
     mapView.getProjection().toPixels(p, screenPts); 

     //---add the marker--- 
     Bitmap bmp = BitmapFactory.decodeResource(
      getResources(), R.drawable.pin);    
     canvas.drawBitmap(bmp, screenPts.x, screenPts.y-50, null);   
     return true; 
    } 

    @Override 
    public boolean onTouchEvent(MotionEvent event, MapView mapView) 
    { 
     //---when user lifts his finger--- 
     if (event.getAction() == 1) {     
      GeoPoint p = mapView.getProjection().fromPixels(
       (int) event.getX(), 
       (int) event.getY()); 
      Geocoder geoCoder = new Geocoder(
        getBaseContext(), Locale.getDefault()); 
       try { 
        List<Address> addresses = geoCoder.getFromLocation(
         p.getLatitudeE6()/1E6, 
         p.getLongitudeE6()/1E6, 1); 

        String add = ""; 
        if (addresses.size() > 0) 
        { 
         for (int i=0; i<addresses.get(0).getMaxAddressLineIndex(); 
          i++) 
          add += addresses.get(0).getAddressLine(i) + "\n"; 
        } 

        Toast.makeText(getBaseContext(), add, Toast.LENGTH_SHORT).show(); 
       } 
       catch (IOException e) {     
        e.printStackTrace(); 
       } 
       return true; 
      } 
      else     
       return false; 
    } 
} 


    public boolean onKeyDown(int keyCode, KeyEvent event) 
    { 
     MapController mc = mapView.getController(); 
     switch (keyCode) 
     { 
      case KeyEvent.KEYCODE_3: 
       mc.zoomIn(); 
       break; 
      case KeyEvent.KEYCODE_1: 
       mc.zoomOut(); 
       break; 
     } 
     return super.onKeyDown(keyCode, event); 
    }  


/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) 
{ 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.map); 
    lm = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 
    lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
      0, new GeoUpdateHandler()); 

    Button btnSend = (Button) findViewById(R.id.btn_send); 
    btnSend.setOnClickListener(new View.OnClickListener(){ 

     public void onClick(View v){ 

       Intent new_intent = new Intent("net.learn2develop.SendSMS"); 
       startActivity(new_intent); 
     } 
    }); 

    mapView = (MapView) findViewById(R.id.mapView); 
    LinearLayout zoomLayout = (LinearLayout)findViewById(R.id.zoom); 
    View zoomView = mapView.getZoomControls(); 

    zoomLayout.addView(zoomView, 
     new LinearLayout.LayoutParams(
      LayoutParams.WRAP_CONTENT, 
      LayoutParams.WRAP_CONTENT)); 
    mapView.displayZoomControls(true); 
    mapView.setSatellite(false); 
    mapView.setStreetView(true); 

    mc = mapView.getController(); 
    String latitude = Integer.toString(lat); 
    String longitude = Integer.toString(lng); 
    String coordinates[] = {latitude, longitude}; 
    double lati = Double.parseDouble(coordinates[0]); 
    double lngi = Double.parseDouble(coordinates[1]); 
    System.out.println("lat" + lati + "lng" + lngi); 
    p = new GeoPoint(
     (int) (lati * 1E6), 
     (int) (lngi * 1E6)); 

    mc.animateTo(p); 
    mc.setZoom(17); 
    mapView.invalidate(); 

    //---Add a location marker--- 
    MapOverlay mapOverlay = new MapOverlay(); 
    List<Overlay> listOfOverlays = mapView.getOverlays(); 
    listOfOverlays.clear(); 
    listOfOverlays.add(mapOverlay);   

    mapView.invalidate(); 


} 


@Override 
protected boolean isRouteDisplayed() { 
    // TODO Auto-generated method stub 
    return false; 
} 
public class GeoUpdateHandler implements LocationListener { 

    @Override 
    public void onLocationChanged(Location location) { 
     lat = (int) (location.getLatitude() * 1E6); 
     lng = (int) (location.getLongitude() * 1E6); 
     System.out.println("lat shld b smth " + lat + "lng smth " +lng); 
     //GeoPoint point = new GeoPoint(lat, lng); 
     //mc.animateTo(point); // mapController.setCenter(point); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
    } 
} 

}

+0

嗨user596379,我可以获得项目源代码吗?我正在为我的论文创建一个原型。你会分享吗?在先进的感谢;) – eros 2011-08-15 06:36:09

回答

0

它需要2至15分钟即可到达卫星GPS定位。您应将代码移动到onLocationChanged()

+0

你的意思是我的代码我移动? // ---添加位置标记--- MapOverlay mapOverlay = new MapOverlay(); List listOfOverlays = mapView.getOverlays(); listOfOverlays.clear(); listOfOverlays.add(mapOverlay); – user596379 2011-02-17 01:07:47

1

如果要显示用户的当前位置,最好使用MyLocationOverlay。您也可以继承它并覆盖onLocationChanged,以插入自定义代码。

通过调用enableMyLocation onResume()和disableMyLocation onPause()来启用它。