2

I had added permission to manifest, i'm test on emulator then map not animateTo geopoint. I'm test on samsung galaxy mini then app crash :(.

Code:

public class atm_atmogan extends MapActivity {

private LocationManager myLocationManager;
private LocationListener myLocationListener;
private MapView myMapView;
private MapController myMapController;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.atm_atmogan);
    myMapView = (MapView)findViewById(R.id.map_view);
    myMapView.setTraffic(true); 
    myMapController = myMapView.getController();

    myLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
    myLocationListener = new MyLocationListener();
    myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,myLocationListener);

    //Get the current location in start-up
    double lat = myLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLatitude();
    double lot = myLocationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER).getLongitude();
    GeoPoint initGeoPoint = new GeoPoint((int)(lat*1E6),(int)(lot*1E6));
    myMapController.animateTo(initGeoPoint);
    myMapController.setZoom(18); 
}

private class MyLocationListener implements LocationListener{
    public void onLocationChanged(Location loc) {
        GeoPoint myGeoPoint = new GeoPoint((int)(loc.getLatitude()*1E6),(int)(loc.getLongitude()*1E6));
        myMapController.animateTo(myGeoPoint);
        myMapController.setZoom(18); 
    }

    public void onProviderDisabled(String provider) {
        }

    public void onProviderEnabled(String provider) {
        }

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

@Override
protected void onPause() {
    super.onPause();
    myLocationManager.removeUpdates(myLocationListener);
}

@Override
protected void onResume() {
    super.onResume();
    myLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,0,0,myLocationListener);
}

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

Logcat:

02-08 14:31:15.481: D/dalvikvm(2292): GC freed 727 objects / 60152 bytes in 148ms
02-08 14:31:17.012: D/dalvikvm(2292): GC freed 143 objects / 7752 bytes in 68ms
02-08 14:39:10.801: W/KeyCharacterMap(2292): No keyboard for id 0
02-08 14:39:10.801: W/KeyCharacterMap(2292): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-08 14:39:17.081: E/ActivityThread(2292): Failed to find provider info for com.google.settings
02-08 14:39:17.091: E/ActivityThread(2292): Failed to find provider info for com.google.settings
02-08 14:39:17.112: E/ActivityThread(2292): Failed to find provider info for com.google.settings
02-08 14:39:17.372: D/LocationManager(2292): Constructor: service = android.location.ILocationManager$Stub$Proxy@44ebe658
02-08 14:39:17.683: I/MapActivity(2292): Handling network change notification:CONNECTED
02-08 14:39:17.683: E/MapActivity(2292): Couldn't get connection factory client
02-08 14:39:20.012: D/dalvikvm(2292): GC freed 5768 objects / 476800 bytes in 87ms
02-08 14:39:20.731: W/KeyCharacterMap(2292): No keyboard for id 0
02-08 14:39:20.731: W/KeyCharacterMap(2292): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
02-08 14:39:20.791:  D/LocationManager(2292): removeUpdates: listener = tim_atm.namespace.atm_atmogan$MyLocationListener@44ec2170
02-08 14:39:21.172: D/dalvikvm(2292): threadid=23 wakeup: interrupted
WarrenFaith
  • 57,492
  • 25
  • 134
  • 150
bulubuloa
  • 597
  • 1
  • 10
  • 21

2 Answers2

3

Try this

 public class MyMapClass extends MapActivity {
MapController mapController;
MyPositionOverlay positionOverlay;

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    MapView myMapView=(MapView)findViewById(R.id.myMapView);
    myMapView.setSatellite(true);
    myMapView.setBuiltInZoomControls(true);
    mapController=myMapView.getController();
    mapController.setZoom(17);
    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 location = locationManager.getLastKnownLocation(provider);

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

        updateWithNewLocation(location);
        locationManager.requestLocationUpdates(provider, 2000, 10,
                locationListener);  
}
private void updateWithNewLocation(Location location) {
    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);

    }
}   
@Override
protected boolean isRouteDisplayed() {

    return true;
}

MyPositionOverlay Class

  public class MyPositionOverlay extends Overlay {
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;
  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(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 false;
}
public Location getLocation() {
  return location;
  }
  public void setLocation(Location location) {
  this.location = location;
  }

}

Sunny
  • 14,522
  • 15
  • 84
  • 129
  • THis code use Activity, MapActivity ?? .. I get some problems.. Can't you give me full code. Thank for help :D – bulubuloa Feb 08 '12 at 15:26
  • did you add the library in manifest `` – Sunny Feb 08 '12 at 15:35
  • yes, i had added inside – bulubuloa Feb 08 '12 at 15:36
  • black screen is on phone or on emulator? – Sunny Feb 08 '12 at 15:38
  • black screen is on emulator and crash on phone – bulubuloa Feb 08 '12 at 15:45
  • Plz help me to sloved my problem :9 – bulubuloa Feb 08 '12 at 16:20
  • see http://stackoverflow.com/questions/7951488/android-mapview-different-in-phone-and-emulator if this is your problem then your phone does not contain map library.and try using another phone. – Sunny Feb 08 '12 at 16:58
  • I had sloved my problem .. In your code GeoPoint point = new GeoPoint(geoLat.intValue(),geoLng.intValue()); .. Your set long = lat and lat = long .. When i test on emulator.. i get geopoint in the sea (black screen :D). Anyway. i have some problem when i test on my phone (samsung galaxy mini) .. app crash.. And on emulator can't set traffic View (only SateliteView) – bulubuloa Feb 08 '12 at 17:04
  • glad that you had solved your problem. As you will see on the above link you have to generate an API key for your phone. debug key may not work.AND for streetView `myMapView.setStreetView(true);`you can accept the answer. – Sunny Feb 08 '12 at 17:13
  • I even tried to set myMapView.setTraffic(true) but map only show as type SateliteView. My user is not enough 15 reputation to accept your answer.. Sorry.. Thank for help somuch – bulubuloa Feb 08 '12 at 17:31
0

Try this:

public class LocationDemo extends Activity implements LocationListener {
    private static final String TAG = "LocationDemo";
    private static final String[] S = { "Out of Service", "Temporarily Unavailable", "Available" };

    private TextView output;
    private LocationManager locationManager;
    private String bestProvider;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        // Get the output UI
        output = (TextView) findViewById(R.id.output);

        // Get the location manager
        locationManager = (LocationManager) getSystemService(LOCATION_SERVICE);

        // List all providers:
        List<String> providers = locationManager.getAllProviders();
        for (String provider : providers) {
            printProvider(provider);
        }

        Criteria criteria = new Criteria();
        bestProvider = locationManager.getBestProvider(criteria, false);
        output.append("\n\nBEST Provider:\n");
        printProvider(bestProvider);

        output.append("\n\nLocations (starting with last known):");
        Location location = locationManager.getLastKnownLocation(bestProvider);
        printLocation(location);
    }

    /** Register for the updates when Activity is in foreground */
    @Override
    protected void onResume() {
        super.onResume();
        locationManager.requestLocationUpdates(bestProvider, 20000, 1, this);
    }

    /** Stop the updates when Activity is paused */
    @Override
    protected void onPause() {
        super.onPause();
        locationManager.removeUpdates(this);
    }

    public void onLocationChanged(Location location) {
        printLocation(location);
    }

    public void onProviderDisabled(String provider) {
        // let okProvider be bestProvider
        // re-register for updates
        output.append("\n\nProvider Disabled: " + provider);
    }

    public void onProviderEnabled(String provider) {
        // is provider better than bestProvider?
        // is yes, bestProvider = provider
        output.append("\n\nProvider Enabled: " + provider);
    }

    public void onStatusChanged(String provider, int status, Bundle extras) {
        output.append("\n\nProvider Status Changed: " + provider + ", Status="
                + S[status] + ", Extras=" + extras);
    }

    private void printProvider(String provider) {
        LocationProvider info = locationManager.getProvider(provider);
        output.append(info.toString() + "\n\n");
    }

    private void printLocation(Location location) {
        if (location == null)
            output.append("\nLocation[unknown]\n\n");
        else
            output.append("\n\n" + location.toString());
    }
}

Please add to the manifest file

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
Sergey Glotov
  • 20,200
  • 11
  • 84
  • 98
Nitesh Khosla
  • 875
  • 8
  • 20