开发者

I want to track my current location in an Android application

开发者 https://www.devze.com 2023-02-15 18:42 出处:网络
Here I create one project that will track our current location. But I have a problem coding it...I don\'t know exactly how to use the OVERLAY class and when it is called.

Here I create one project that will track our current location. But I have a problem coding it... I don't know exactly how to use the OVERLAY class and when it is called.

I have posted my code.. Please help me

package com.techno.gps;

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 com.google.android.maps.Projection;

import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import an开发者_如何学运维droid.graphics.Point;
import android.graphics.RectF;
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;

public class gps extends MapActivity{

    MapController mapController;
     Location location;
     MyPositionOverlay positionOverlay;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

     // Get a reference to the MapView
        MapView myMapView = (MapView)findViewById(R.id.mapView);
        // Get the Map View’s controller
        mapController = myMapView.getController();
        // Configure the map display options
        myMapView.setSatellite(true);
        myMapView.setStreetView(true);
        myMapView.displayZoomControls(false);
        // Zoom in
        mapController.setZoom(17);
        //add postionoverlay
        positionOverlay = new MyPositionOverlay();
        List<Overlay> overlays = myMapView.getOverlays();
        overlays.add(positionOverlay);

        LocationManager locationManager;
        String context = Context.LOCATION_SERVICE;
        locationManager = (LocationManager)getSystemService(context);

        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 = locationManager.getLastKnownLocation(provider);
        updateWithNewLocation(location);
        locationManager.requestLocationUpdates(provider, 2000, 10,locationListener);

    }

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

    private void updateWithNewLocation(Location location)
    {
        String latLongString;
        TextView myLocationText;
        myLocationText = (TextView)findViewById(R.id.myLocationText);

        String addressString = "No address found";
        if (location != null) {
        // Update the map location.
        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 + " Long:" + lng;
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();
        Geocoder gc = new Geocoder(this, Locale.getDefault());
        try 
        {
                List<Address> addresses = gc.getFromLocation(latitude, longitude, 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);


        }

        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)
        { 

        }
    };

    public class MyPositionOverlay extends Overlay 
    {
        Location location;
        @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;
            geoPoint = new GeoPoint(latitude.intValue(),longitude.intValue());
            // Convert the location to screen pixels
            int mRadius=5;
            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(250, 255, 0, 0);
            paint.setAntiAlias(true);
            paint.setFakeBoldText(true);
            Paint backPaint = new Paint();
            backPaint.setARGB(175, 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 true if screen tap is handled by this overlay
            return false;
        }

        public Location getLocation() {
        return location;
        }
        public void setLocation(Location location) {
        this.location = location;
        }

   }

}

thanks...


Strange that you don't know your own code. You should try writing it by yourself. Copy-pasting does not work always.

To answer your question. An Overlay is drawable object that can be shown on top of the map on a different layer above the MapView.

This is the part of the code where you add that drawing to the MapView.

    positionOverlay = new MyPositionOverlay();
    List<Overlay> overlays = myMapView.getOverlays();
    overlays.add(positionOverlay);

You are doing this in OnCreate(). Which does not makes sense, because you have no position fix yet.

  1. Add the overlay when you get a pos-fix in updateWithNewLocation()
  2. To call draw forcefully use MapView.invalidate()


i have the same example code, with 2.2 android, works, but don't drow the overlay, with my position, otherwise, with debuggin you can see code working properltly. Really strange.

I think code is correct, because, in onCreate, code is initializated, then in updateWithNewLocation, the overlay is updated with positionOverlay.setLocation(location);

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号