7

I am writing an app that requires to get the current map location. My Map file works fine by it self, but I need to get the address (see addressString below at the buttom) from another Activity. I tried getAddress/setAddress (setters/getters). They do not work. They always return 'no address' (the default).

Here is my code...

How can I make this a standalone Java class??? Or get the address from another activity?

Thanks a lot.

This code works by itself.

Mat


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 java.io.IOException;
import java.util.List;
import java.util.Locale;

public class GetMapAddress extends MapActivity {

    MapController mapController;

    MyPositionOverlay positionOverlay;

    MapController mc;

    GeoPoint p;

    String addressString = "No address found";

    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.map);

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

        myMapView.setBuiltInZoomControls(true);

        // 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);

        mc = myMapView.getController();
        String coordinates[] = {
            "1.352566007", "103.78921587"
        };
        double lat = Double.parseDouble(coordinates[0]);
        double lng = Double.parseDouble(coordinates[1]);

        p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));

        mc.animateTo(p);
        mc.setZoom(17);
        myMapView.invalidate();

    }

    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;

        if (location != null) {
            // Update my location marker
            positionOverlay.setLocation(location);

            // Update the map 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.getCountryName());
                }
                addressString = sb.toString();
            } catch (IOException e) {
            }
        } else {

            // Place the CellID here
            latLongString = "No location found";

        }
        // This commented out line will include latitute and longtitute
        // myLocationText.setText("Your Phone is Currently at.. \n" + latLongString + "\n" +
        // addressString);

        myLocationText.setText("Your Phone is Currently at.. \n" + addressString);
        setAddress(addressString);

        ;

    }

    public void setAddress(String add) {
        this.addressString = add;
    }

    public String getAddress() {

        return addressString;
    }

    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}
Christopher Orr
  • 110,418
  • 27
  • 198
  • 193
Yassin
  • 81
  • 1
  • 1
  • 2
  • Are you getting any error? Because the code you have is absolutely right, i have used in my app and working fine for me. If you have some error please post the error log. – Scorpion Mar 08 '12 at 06:23
  • Geocoder gc = new Geocoder(this, Locale.getDefault()); instead of this please try this one. Geocoder gc = new Geocoder(youractivityclassname.this.getApplicationContext(), Locale.getDefault()); – Scorpion Mar 08 '12 at 06:25

3 Answers3

10

I have used the following code in my app and its working absolutely fine for me. Try this. Hope this will help you.

    //
    //  Write the location name.
    //

    try {

        Geocoder geo = new Geocoder(youractivityclassname.this.getApplicationContext(), Locale.getDefault());
        List<Address> addresses = geo.getFromLocation(latitude, longitude, 1);
        if (addresses.isEmpty()) {
            yourtextfieldname.setText("Waiting for Location");
        }
        else {
            if (addresses.size() > 0) {
                yourtextfieldname.setText(addresses.get(0).getFeatureName() + ", " + addresses.get(0).getLocality() +", " + addresses.get(0).getAdminArea() + ", " + addresses.get(0).getCountryName());
                //Toast.makeText(getApplicationContext(), "Address:- " + addresses.get(0).getFeatureName() + addresses.get(0).getAdminArea() + addresses.get(0).getLocality(), Toast.LENGTH_LONG).show();
            }
        }
    }
    catch (Exception e) {
        e.printStackTrace(); // getFromLocation() may sometimes fail
    }
sulai
  • 5,204
  • 2
  • 29
  • 44
Scorpion
  • 6,831
  • 16
  • 75
  • 123
  • this throws "The Google Play services resources were not found. Check your project configuration to ensure that the resources are included." – alicanbatur Mar 13 '14 at 14:26
  • this method is unreliable and has bugs. Check this: https://stackoverflow.com/q/47331480/1397821 – M. Usman Khan Dec 14 '19 at 13:33
0

Either pass the address to your second Activity in the Intent, or if you need to do lookups from your second Activity, just call Geocoder from there.

If you're somehow instantiating the above class (GetMapActivity) from your second Activity and calling the getAddress method, that won't work.

Christopher Orr
  • 110,418
  • 27
  • 198
  • 193
0

The following might work [move the code from onCreate and put it in a method]

public String getAddressString() {
        if (addressString.equals("default") {
          LocationManager lm = (LocationManager)act.getSystemService(Context.LOCATION_SERVICE);
          Criteria crit = new Criteria();
          crit.setAccuracy(Criteria.ACCURACY_FINE);
          String provider = lm.getBestProvider(crit, true);
          updateWithNewLocation(lm.getLastKnownLocation(provider));              
        }
        return addressString;
    }
Shreesh
  • 677
  • 5
  • 15