Mega Code Archive

 
Categories / Android / Core Class
 

My Position Overlay

package app.test; import java.io.IOException; import java.util.List; import java.util.Locale; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapActivity; import com.google.android.maps.MapController; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import android.content.Context; import android.location.Address; import android.location.Criteria; import android.location.Geocoder; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.widget.TextView; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Point; import android.graphics.RectF; import android.location.Location; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; import com.google.android.maps.Projection; class MyPositionOverlay extends Overlay {   public Location getLocation() {     return location;   }   public void setLocation(Location location) {     this.location = location;   }       Location location;     private final int mRadius = 5;   @Override   public void draw(Canvas canvas, MapView mapView, boolean shadow) {     Projection projection = mapView.getProjection();     if (shadow == false) {       // Get the current location       Double latitude = location.getLatitude()*1E6;       Double longitude = location.getLongitude()*1E6;       GeoPoint geoPoint = new GeoPoint(latitude.intValue(),longitude.intValue());       // Convert the location to screen pixels        Point point = new Point();       projection.toPixels(geoPoint, point);       RectF oval = new RectF(point.x - mRadius, point.y - mRadius,                               point.x + mRadius, point.y + mRadius);       // Setup the paint       Paint paint = new Paint();       paint.setARGB(255, 255, 255, 255);       paint.setAntiAlias(true);       paint.setFakeBoldText(true);       Paint backPaint = new Paint();       backPaint.setARGB(180, 50, 50, 50);       backPaint.setAntiAlias(true);       RectF backRect = new RectF(point.x + 2 + mRadius, point.y - 3*mRadius,                                  point.x + 65, point.y + mRadius);       // Draw the marker       canvas.drawOval(oval, paint);       canvas.drawRoundRect(backRect, 5, 5, backPaint);       canvas.drawText("Here I Am", point.x + 2*mRadius, point.y, paint);     }     super.draw(canvas, mapView, shadow);   }        @Override   public boolean onTap(GeoPoint point, MapView mapView) {     return false;   } } public class Test extends MapActivity {   MapController mapController;   MyPositionOverlay positionOverlay;       @Override   public void onCreate(Bundle icicle) {     super.onCreate(icicle);     setContentView(R.layout.main);     MapView myMapView = (MapView)findViewById(R.id.myMapView);     mapController = myMapView.getController();          // Configure the map display options     myMapView.setSatellite(true);     myMapView.setStreetView(true);          // Zoom in     mapController.setZoom(17);          // Add the MyPositionOverlay     positionOverlay = new MyPositionOverlay();     List<Overlay> overlays = myMapView.getOverlays();     overlays.add(positionOverlay);     LocationManager locationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);     Criteria criteria = new Criteria();     criteria.setAccuracy(Criteria.ACCURACY_FINE);     criteria.setAltitudeRequired(false);     criteria.setBearingRequired(false);     criteria.setCostAllowed(true);     criteria.setPowerRequirement(Criteria.POWER_LOW);     String provider = locationManager.getBestProvider(criteria, true);     Location location = locationManager.getLastKnownLocation(provider);     updateWithNewLocation(location);     locationManager.requestLocationUpdates(provider, 2000, 10, locationListener);   }   private final LocationListener locationListener = new LocationListener() {     public void onLocationChanged(Location location) {       updateWithNewLocation(location);     }         public void onProviderDisabled(String provider){       updateWithNewLocation(null);     }     public void onProviderEnabled(String provider) {}     public void onStatusChanged(String provider, int status, Bundle extras) {}   };      /** Update the map with a new location */   private void updateWithNewLocation(Location location) {     TextView myLocationText = (TextView)findViewById(R.id.myLocationText);     String latLongString;     String addressString = "No address found";     if (location != null) {       positionOverlay.setLocation(location);       Double geoLat = location.getLatitude()*1E6;       Double geoLng = location.getLongitude()*1E6;       GeoPoint point = new GeoPoint(geoLat.intValue(), geoLng.intValue());       mapController.animateTo(point);       double lat = location.getLatitude();       double lng = location.getLongitude();       latLongString = "Lat:" + lat + "\nLong:" + lng;       Geocoder gc = new Geocoder(this, Locale.getDefault());       try {         List<Address> addresses = gc.getFromLocation(lat, lng, 1);         StringBuilder sb = new StringBuilder();         if (addresses.size() > 0) {           Address address = addresses.get(0);           for (int i = 0; i < address.getMaxAddressLineIndex(); i++)             sb.append(address.getAddressLine(i)).append("\n");           sb.append(address.getLocality()).append("\n");           sb.append(address.getPostalCode()).append("\n");           sb.append(address.getCountryName());         }         addressString = sb.toString();       } catch (IOException e) {}     } else {       latLongString = "No location found";     }     myLocationText.setText("Your Current Position is:\n" + latLongString + "\n" + addressString);   }   @Override   protected boolean isRouteDisplayed() {     return false;   } } //layout/main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout    xmlns:android="http://schemas.android.com/apk/res/android"   android:orientation="vertical"   android:layout_width="fill_parent"   android:layout_height="fill_parent">   <TextView       android:id="@+id/myLocationText"     android:layout_width="fill_parent"      android:layout_height="wrap_content"      android:text="@string/hello"   />   <com.google.android.maps.MapView     android:id="@+id/myMapView"     android:layout_width="fill_parent"      android:layout_height="fill_parent"     android:enabled="true"     android:clickable="true"     android:apiKey="IsEmptyBsluf"   /> </LinearLayout>