2012-09-20 34 views
1

我有一个MapActivity,必须使用myLocationOverlay显示我在地图上的当前位置,我从服务中获取位置。从服务获取位置,但myLocationOverlay不起作用

这里是我的活动:

public class ShowMapActivity extends MapActivity { 

private MapController mapController; 
private MapView mapView; 
private LocationManager locationManager; 
private MyOverlayUtility itemizedoverlay; 
private MyLocationOverlay myLocationOverlay; 
private double latitude; 
private double longitude; 

public void onCreate(Bundle bundle) { 
    super.onCreate(bundle); 
    setContentView(R.layout.activity_showmap); 
    Intent serviceIntent = new Intent(this, LocationService.class); 
    serviceIntent.setAction("startListening"); 
    startService(new Intent(this, LocationService.class)); 
    // check if the GPS is on 
    // isGPSEnable(); 
    IntentFilter filter = new IntentFilter(); 
    filter.addAction(UPDATE_MAP); 
    registerReceiver(updateReceiver, filter); 

    // Configure the Map 
    mapView = (MapView) findViewById(R.id.mapview); 
    mapView.setBuiltInZoomControls(true); 
    mapView.setSatellite(true); 
    mapController = mapView.getController(); 
    mapController.setZoom(14); 

    myLocationOverlay = new MyLocationOverlay(this, mapView); 
    myLocationOverlay.runOnFirstFix(new Runnable() { 
     public void run() { 
      mapView.getController().animateTo(
        myLocationOverlay.getMyLocation()); 
     } 
    }); 

} 

@Override 
protected boolean isRouteDisplayed() { 
    return true; 
} 

private final String UPDATE_MAP = "com.livetrekker.activities.UPDTAE_LOCATION"; 
private BroadcastReceiver updateReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     longitude = intent.getDoubleExtra("long", 0); 
     latitude = intent.getDoubleExtra("lat", 0); 
     Log.e("LOCATION", "lat = " + latitude + " long = " + longitude); 
    } 
};} 

这里是我的服务:

public class LocationService extends Service implements LocationListener { 

private final String UPDATE_MAP = "com.livetrekker.activities.UPDTAE_LOCATION"; 
private LocationManager locationManager; 
private String provider; 

private Location location; 

@Override 
public int onStartCommand(final Intent intent, final int flags, 
     final int startId) { 

    Log.e("Service", "start location"); 
    // if (intent.getAction().equals("startListening")) { 
    locationManager = (LocationManager) this 
      .getSystemService(Context.LOCATION_SERVICE); 
    Criteria criteria = new Criteria(); 
    provider = locationManager.getBestProvider(criteria, false); 
    Location location = locationManager.getLastKnownLocation(provider); 

    if (location != null) { 
     Log.e("LOCATION", "Provider " + provider + " has been selected"); 
     onLocationChanged(location); 
    } 

    locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 
      0, this); 

    // } 
    /* 
    * else { if (intent.getAction().equals("stopListening")) { 
    * locationManager.removeUpdates(this); locationManager = null; } } 
    */ 

    return START_STICKY; 

} 

@Override 
public IBinder onBind(final Intent intent) { 
    return null; 
} 

@Override 
public void onLocationChanged(final Location location) { 
    this.location = location; 
    double lng = location.getLongitude(); 
    double lat = location.getLatitude(); 
    Log.e("SERVICELOCATION", "lat : " + lat + " lng : " + lng); 
    Intent updateIntent = new Intent(); 
    updateIntent.putExtra("long", lng); 
    updateIntent.putExtra("lat", lat); 
    updateIntent.setAction(UPDATE_MAP); 
    getApplicationContext().sendBroadcast(updateIntent); 
} 

public void onProviderDisabled(final String provider) { 
} 

public void onProviderEnabled(final String provider) { 
} 

public void onStatusChanged(final String arg0, final int arg1, 
     final Bundle arg2) { 
}} 

所以外景经理工作得很好,我能够得到我的经度和纬度在我的活动,但myLocationOverlay没有出现。

那么有可能使用这种方式来显示我在地图上的当前位置?

感谢

编辑:

我定势我的问题,通过更换

myLocationOverlay = new MyLocationOverlay(this, mapView); 
    myLocationOverlay.runOnFirstFix(new Runnable() { 
     public void run() { 
      mapView.getController().animateTo(
        myLocationOverlay.getMyLocation()); 
     } 
    }); 

List overlays = mapView.getOverlays(); 
    MyLocationOverlay myLocationOverlay = new MyLocationOverlay(this, mapView); 
    myLocationOverlay.enableMyLocation(); 
    overlays.add(myLocationOverlay); 

回答

0

关注这个代码:

public class GoogleMapsActivity extends MapActivity { 
    public static final String TAG = "GoogleMapsActivity"; 
    private MapView mapView; 
    private LocationManager locationManager; 
    Geocoder geocoder; 
    Location location; 
    LocationListener locationListener; 
    CountDownTimer locationtimer; 
    MapController mapController; 
    MapOverlay mapOverlay = new MapOverlay(); 

    @Override 
    protected void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.googlemap); 
     initComponents(); 
     mapView.setBuiltInZoomControls(true); 
     mapView.setSatellite(true); 
     mapController = mapView.getController(); 
     mapController.setZoom(16); 
     locationManager = (LocationManager) getSystemService(LOCATION_SERVICE); 
     if (locationManager == null) { 
      Toast.makeText(GoogleMapsActivity.this, 
        "Location Manager Not Available", Toast.LENGTH_SHORT) 
        .show(); 
      return; 
     } 
     location = locationManager 
       .getLastKnownLocation(LocationManager.GPS_PROVIDER); 
     if (location == null) 
      location = locationManager 
        .getLastKnownLocation(LocationManager.NETWORK_PROVIDER); 
     if (location != null) { 
      double lat = location.getLatitude(); 
      double lng = location.getLongitude(); 
      Toast.makeText(GoogleMapsActivity.this, 
        "Location Are" + lat + ":" + lng, Toast.LENGTH_SHORT) 
        .show(); 
      GeoPoint point = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6)); 
      mapController.animateTo(point, new Message()); 
      mapOverlay.setPointToDraw(point); 
      List<Overlay> listOfOverlays = mapView.getOverlays(); 
      listOfOverlays.clear(); 
      listOfOverlays.add(mapOverlay); 
     } 
     locationListener = new LocationListener() { 
      @Override 
      public void onStatusChanged(String arg0, int arg1, Bundle arg2) { 
      } 

      @Override 
      public void onProviderEnabled(String arg0) { 
      } 

      @Override 
      public void onProviderDisabled(String arg0) { 
      } 

      @Override 
      public void onLocationChanged(Location l) { 
       location = l; 
       locationManager.removeUpdates(this); 
       if (l.getLatitude() == 0 || l.getLongitude() == 0) { 
       } else { 
        double lat = l.getLatitude(); 
        double lng = l.getLongitude(); 
        Toast.makeText(GoogleMapsActivity.this, 
          "Location Are" + lat + ":" + lng, 
          Toast.LENGTH_SHORT).show(); 
       } 
      } 
     }; 
     if (locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) 
      locationManager.requestLocationUpdates(
        LocationManager.GPS_PROVIDER, 1000, 10f, locationListener); 
     locationManager.requestLocationUpdates(
       LocationManager.NETWORK_PROVIDER, 1000, 10f, locationListener); 
     locationtimer = new CountDownTimer(30000, 5000) { 
      @Override 
      public void onTick(long millisUntilFinished) { 
       if (location != null) 
        locationtimer.cancel(); 
      } 

      @Override 
      public void onFinish() { 
       if (location == null) { 
       } 
      } 
     }; 
     locationtimer.start(); 
    } 

    public MapView getMapView() { 
     return this.mapView; 
    } 

    private void initComponents() { 
     mapView = (MapView) findViewById(R.id.googleMapview); 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     return false; 
    } 

    class MapOverlay extends Overlay { 
     private GeoPoint pointToDraw; 

     public void setPointToDraw(GeoPoint point) { 
      pointToDraw = point; 
     } 

     public GeoPoint getPointToDraw() { 
      return pointToDraw; 
     } 

     @Override 
     public boolean draw(Canvas canvas, MapView mapView, boolean shadow, 
       long when) { 
      super.draw(canvas, mapView, shadow); 

      Point screenPts = new Point(); 
      mapView.getProjection().toPixels(pointToDraw, screenPts); 

      Bitmap bmp = BitmapFactory.decodeResource(getResources(), 
        R.drawable.pingreen); 
      canvas.drawBitmap(bmp, screenPts.x, screenPts.y - 24, null); 
      return true; 
     } 
    } 

} 

(OR)按照此链接:http://www.javacodegeeks.com/2011/02/android-google-maps-tutorial.html

+0

的事情是我必须使用一个服务,我需要对其他后台进程我的位置ANS我不想重复的位置代码(除非我真的有)。 – Kalimero95