2010-08-11 6 views
0

Google지도에서 MyLocationOverlay 클래스를 구현하려고합니다. 그러나, 내 자신의 locationManager를 사용하려고 할 때 - 나는 오버레이를 acutally지도 위에 그리게 할 수 없다. 내가 뭔가 잘못하고 있는지 궁금해.내 위치 중첩 업데이트 시간 맞춤 설정

MyLocationOverlay 클래스의 super 메서드 (enbaleMyLocation)를 locationManager에서 너무 빨리 업데이트하고 배터리를 먹을 것이므로이 메서드를 호출하고 싶지 않습니다.

private class CenterOverlay extends MyLocationOverlay { 

    private Context mContext; 
    private LocationManager mLocManager; 

    public CenterOverlay(Context context, MapView mapView) { 
     super(context, mapView); 
     this.mContext = context; 

    } 

    @Override 
    public void onLocationChanged(Location location) { 
     super.onLocationChanged(location); 
     try { 
      doExternalCenterOverlayTask(location); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      ErrorHandler.serviceException(mContext); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      ErrorHandler.IOException(mContext); 
     } catch (ServiceException e) { 
      e.printStackTrace(); 
      ErrorHandler.serviceException(mContext); 
     } 
    } 

    @Override 
    public boolean enableMyLocation() { 
     mLocManager = (LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE); 
     mLocManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 50, this); 
     mLocManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 5000, 25, this); 

     return mLocManager.isProviderEnabled(LocationManager.GPS_PROVIDER) 
       || mLocManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER); 
    } 

    @Override 
    public void disableMyLocation() { 
     super.disableMyLocation(); 
     mLocManager.removeUpdates(this); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     super.onProviderDisabled(provider); 
     ViewAdapter.createStandardAlertDialog(mContext, 
       "Your location provider has been disabled, please re-enable it."); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     super.onProviderEnabled(provider); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     super.onStatusChanged(provider, status, extras); 
     if (status == 0) { 
      ViewAdapter.showLongToast(mContext, "Location is not available at this time"); 
     } else if (status == 1) { 
      //Trying to connect 
     } else if (status == 2) { 
      // Available 
     } 

    } 

} 

답변

5

나는이 사실을 알고 있으며 Google이 코드를 업데이트 할 때까지는 할 수 없습니다.

대신 내 위치를 그리는 클래스를 만들었습니다. 원하는 위치에 언제든지 업데이트 할 수 있습니다.

코드는 여기에 있습니다.

/** 
* 
* @author (hwrdprkns) 
* 2010 
* 
*/ 
public class CenterOverlay extends ItemizedOverlay<OverlayItem> implements LocationListener { 

private static final String TAG = "CenterOverlay: "; 

private LocationManager mLocationManager; 

private long updateTime = 60000; 

private static final int updateDistance = 50; 

private GeoPoint lastKnownPoint; 

private Location lastKnownLocation; 

private Drawable centerDrawable; 

private Context mContext; 

private final List<OverlayItem> mOverlays = new ArrayList<OverlayItem>(); 

private Paint accuracyPaint; 

private Point center; 

private Point left; 

private Drawable drawable; 

private int width; 

private int height; 

// San Francisco 
private final static double[] DEFAULT_LOCATION = { 
     37.7749295, -122.4194155 
}; 

private Runnable firstFixRunnable = null; 

private boolean firstFixRun = false; 

public CenterOverlay(Drawable defaultMarker, MapView mapView, Context c) { 
    super(boundCenter(defaultMarker)); 
    this.centerDrawable = defaultMarker; 
    this.mContext = c; 
    mLocationManager = (LocationManager) c.getSystemService(Context.LOCATION_SERVICE); 

    if (Constants.DEBUG) { 
     updateTime = 0; 
    } else { 
     updateTime = 60000; 
    } 
} 

public void addOverlay(OverlayItem overlay) { 
    mOverlays.add(overlay); 
    populate(); 
} 

private void checkFirstRunnable() { 
    if (!firstFixRun && lastKnownLocation != null && firstFixRunnable != null) { 
     firstFixRunnable.run(); 
    } 
} 

private OverlayItem createCenterOverlay(GeoPoint point) { 
    OverlayItem i = new OverlayItem(point, "Location", null); 
    i.setMarker(centerDrawable); 
    return i; 
} 

private GeoPoint createGeoPoint(Location loc) { 
    int lat = (int) (loc.getLatitude() * 1E6); 
    int lng = (int) (loc.getLongitude() * 1E6); 
    return new GeoPoint(lat, lng); 
} 

@Override 
protected OverlayItem createItem(int i) { 
    return mOverlays.get(i); 
} 

public void disableLocation() { 
    mLocationManager.removeUpdates(this); 
} 

@Override 
public void draw(Canvas canvas, MapView mapView, boolean shadow) { 
    drawMyLocation(canvas, mapView, lastKnownLocation, lastKnownPoint, 0); 
} 

protected void drawMyLocation(Canvas canvas, MapView mapView, Location lastFix, GeoPoint myLoc, 
     long when) { 

    accuracyPaint = new Paint(); 
    accuracyPaint.setAntiAlias(true); 
    accuracyPaint.setStrokeWidth(2.0f); 

    drawable = centerDrawable; 
    width = drawable.getIntrinsicWidth(); 
    height = drawable.getIntrinsicHeight(); 
    center = new Point(); 
    left = new Point(); 

    Projection projection = mapView.getProjection(); 

    double latitude = lastFix.getLatitude(); 
    double longitude = lastFix.getLongitude(); 
    float accuracy = lastFix.getAccuracy(); 

    float[] result = new float[1]; 

    Location.distanceBetween(latitude, longitude, latitude, longitude + 1, result); 
    float longitudeLineDistance = result[0]; 

    GeoPoint leftGeo = new GeoPoint((int) (latitude * 1e6), (int) ((longitude - accuracy 
      /longitudeLineDistance) * 1e6)); 
    projection.toPixels(leftGeo, left); 
    projection.toPixels(myLoc, center); 
    int radius = center.x - left.x; 

    accuracyPaint.setColor(0xff6666ff); 
    accuracyPaint.setStyle(Style.STROKE); 
    canvas.drawCircle(center.x, center.y, radius, accuracyPaint); 

    accuracyPaint.setColor(0x186666ff); 
    accuracyPaint.setStyle(Style.FILL); 
    canvas.drawCircle(center.x, center.y, radius, accuracyPaint); 

    drawable.setBounds(center.x - width/2, center.y - height/2, center.x + width/2, 
      center.y + height/2); 
    drawable.draw(canvas); 
} 

public void enableMyLocation() { 
    for (String s : mLocationManager.getProviders(true)) { 
     mLocationManager.requestLocationUpdates(s, updateTime, updateDistance, this); 
    } 

    Location loc = null; 

    for (String s : mLocationManager.getProviders(true)) { 
     loc = mLocationManager.getLastKnownLocation(s); 
     if (loc != null) { 
      loc.setLatitude(DEFAULT_LOCATION[0]); 
      loc.setLongitude(DEFAULT_LOCATION[1]); 
      lastKnownLocation = loc; 
      lastKnownPoint = createGeoPoint(loc); 
      return; 
     } 
    } 

    loc = new Location(LocationManager.GPS_PROVIDER); 
    loc.setLatitude(DEFAULT_LOCATION[0]); 
    loc.setLongitude(DEFAULT_LOCATION[1]); 

    lastKnownLocation = loc; 
    lastKnownPoint = createGeoPoint(loc); 
} 

public Location getLastKnownLocation() { 
    return lastKnownLocation; 
} 

public GeoPoint getLastKnownPoint() { 
    return lastKnownPoint; 
} 

public void onLocationChanged(Location location) { 
    checkFirstRunnable(); 
    this.lastKnownLocation = location; 
    this.lastKnownPoint = createGeoPoint(location); 
    replaceOverlay(createCenterOverlay(lastKnownPoint)); 

} 

public void onProviderDisabled(String provider) { 
    ViewAdapter.showLongToast(mContext, 
      "Your location provider has been disabled -- please reenable it"); 

} 

public void onProviderEnabled(String provider) { 

} 

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

    if (status == LocationProvider.AVAILABLE) { 

    } 
    if (status == LocationProvider.OUT_OF_SERVICE) { 
     ViewAdapter.showShortToast(mContext, "Location is temporarily out of service."); 
    } 
    if (status == LocationProvider.TEMPORARILY_UNAVAILABLE) { 

    } 
} 

private void replaceOverlay(OverlayItem overlay) { 
    mOverlays.clear(); 
    mOverlays.add(overlay); 
    populate(); 
} 

public boolean runOnFirstFix(Runnable runnable) { 

    if (lastKnownLocation != null) { 
     runnable.run(); 
     return true; 
    } 

    firstFixRunnable = runnable; 
    return false; 

} 

@Override 
public int size() { 
    return mOverlays.size(); 
} 

public void updateLocation() { 

} 

}

+0

게시물을 보내 주셔서 감사합니다. 작동하지 않는 것 같습니다. "GeoPoint leftGeo = new GeoPoint ("저는 새로 만든 객체에서 enableMyLocation()이라는 새 CenterOverlay 객체를 만든 후 오버레이에 객체를 추가했습니다. mapView.getOverlays(). add (obj). 내가 잘못 했나요? 미리 감사드립니다! – Dr1Ku

1

당신은 어디 코드에서지도보기로 오버레이를 추가하지 않을 :

여기 내 코드입니다. 나는. like mapView.getOverlays().add(centerOverlay);

일반적으로 게시자가 게시 한 수업 외부에서 발생합니다. 관련 활동의 나머지 코드를 게시 할 수 있습니까?

btw : 클래스 (CenterOverlay)와 생성자 (TaggstrCenterOverlay)의 이름이 다릅니다 ... 올바른가요?

+0

그것은 문제가되지해야한다 -. 그것은 아무튼 왜 문자 그대로 당신이 당신의 코드에 넣어처럼 오버레이를 추가'mapView.getOverlays는() (centerOverlay)를 추가'나도 몰라 내가 슈퍼 메서드를 호출하지 않을 때 나타납니다. 안드로이드 코드에 대한 Google지도를 조사 할 수있는 방법이 있습니까 (생각하지는 않지만). – hwrdprkns

+0

당신이 말하는 슈퍼 메서드, super (context, mapView); 위의 클래스는 MyLocationOverlay에서 확장됩니다. MyLocationOverlay는 SDK가 아닌 사용자 정의 클래스입니다. 그리고 위의 게시 된 클래스에는 그리기 메소드가 없습니다. 당신은 draw 메소드 (MyLocationOverlay)를 포함한 클래스를 게시 할 수 있습니까? –

+0

'MyLocationOverlay' (http://bit.ly/dBIVdj)는 커스텀 클래스가 아닙니다. (적어도 당신의 말로 생각합니다.) GoogleMaps SDK에서 가져 왔습니다. – hwrdprkns