views:

240

answers:

1

package net.learn2develop.PopularAttractions;

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 android.location.Address; import android.location.Geocoder; import android.os.Bundle; import android.util.Log; import android.view.KeyEvent; import android.view.View;

import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.Toast; import android.widget.AdapterView.OnItemSelectedListener;

public class PopularAttractions extends MapActivity {

private String[ ][ ] locations = {
        {"Chinatown Heritage Center","1.2836,103.84425"},
        {"Escape Theme Park","1.38104,103.936928"},
        {"G-Max Reverse Bungy","1.2906,103.845322"},
        {"Jurong BirdPark","1.32005,103.707153"},
        {"NEWater Visitor Center","1.33105,103.955311"},
        {"Red Dot Design Museum","1.277762,103.846225"},
        {"Singapore Botanic Garden","1.31471,103.815689"},
        {"Singapore Science Center","1.3249,103.740578"},
        {"Singapore Zoological Garden","1.40502,103.793449"},
        {"Snow City","1.32823,103.74263"},
        {"Sungei Buloh Wetland Reserver","1.445144,103.729595"},
        {"Super Ice World","1.300422,103.875348"},
    };

 Spinner spinnerView;
 MapView mapView;
 MapController mc;


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

    spinnerView = (Spinner) this.findViewById(R.id.spinner1);
    mapView = (MapView) findViewById(R.id.mapview1);
    mc = mapView.getController();

    ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_dropdown_item);

    for(int i = 0; i < locations.length; i++)
        adapter.add(locations[i][0]);


    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
    spinnerView.setAdapter(adapter);
    spinnerView.setOnItemSelectedListener(selectListener);

    gotoSelected();
}



private OnItemSelectedListener selectListener = new OnItemSelectedListener() {

    public void onItemSelected(
            AdapterView<?>parent, View v, int position, long id)
    {
        gotoSelected();
    }

    public void onNothingSelected(AdapterView<?> arg0) {}

};


public void gotoSelected()
{

    int index = spinnerView.getSelectedItemPosition();
    String[] coordinates = locations[index][1].split(",");
    double lat = Double.parseDouble(coordinates[0]);
    double lng = Double.parseDouble(coordinates[1]);

    Geocoder geocoder = new Geocoder(this, Locale.getDefault()); 
    try {
        List<Address> addresses = geocoder.getFromLocation(lat, lng, 1);
         Address ad = addresses.get(0); 
        String buff = new String();
    for(int i = 0; i <= ad.getMaxAddressLineIndex(); i++ ) { 
             buff += ad.getAddressLine(i);
     Toast.makeText(getBaseContext(), buff, Toast.LENGTH_SHORT).show();
  GeoPoint location = new GeoPoint (
        (int)(lat * 1E6),
        (int)(lng * 1E6));

            mc.animateTo(location);
            mc.setZoom(16);

      mapView.setStreetView(true);


     }
     for (Address a : addresses) { 
         Log.v("TAG", a.toString()); 
     } 


    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 

}

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    MapController mc = mapView.getController(); 
    switch (keyCode) 
    {
        case KeyEvent.KEYCODE_2:
            mc.zoomIn();
            break;
        case KeyEvent.KEYCODE_1:
            mc.zoomOut();
            break;
    }
    return super.onKeyDown(keyCode, event);
}

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

}
A: 

You could try Geocoder: http://developer.android.com/intl/zh-CN/reference/android/location/Geocoder.html

for(int i = 0; i < locations.length; i++) {

        List<Address> list;
        Geocoder geo = new Geocoder(this); 
        try {
                String[] latlong = locations[i][1].split(",");
                list = geo.getFromLocation(Double.valueOf(latlong[0]), Double.valueOf(latlong[1]), 1); // the 1st result should be the best one
                Address ad = list.get(0); // Position 0 is the most specific to the coordinates.
                String buff = new String(); 
                for(int i = 0; i <= ad.getMaxAddressLineIndex(); i++ ) {
                     buff += ad.getAddressLine(i); // for a good addres(with street name u should get getMaxAddressLineIndex() = 2
                     // HERE you would want to do something with buff to show or to store it

                 }


                for (Address a : list) {
                    Log.v("TAG", a.toString());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }

Usually the first one in the list should be the one you are interested. For each Address you take the address with getAddressLine(int pos), normally you will get in position 0 the name of the street, in position 1 the zipcode + city and the next one the country. However, I haven't made enough tests to be sure of this.

To get the address you could use something like this:

Address ad = list.get(0); // Position 0 is the most specific to the coordinates.
String buff = new String(); 
for(int i = 0; i <= ad.getMaxAddressLineIndex(); i++ ) {
    buff += ad.getAddressLine(i); // for a good addres(with street name u should get getMaxAddressLineIndex() = 2
}
janfsd
Thanks! but how do i add it into the codings?
KKC
after i added the codes u given me..the address didnt appear. do i need to do something else?
KKC
I tried it with the 1st pair of your coordinates and it gave me an address: geo.getFromLocation(1.40502, 103.793449, 3);For your code you would need to iterate for your String locations, and use the second part, probably splitting it with String.split(",") to get latitude and longitude separate and for each one you get the address. I added some more code to my answer.
janfsd
I edited the code to fit yours, however haven't tested it, maybe I could have some mistake in coding. With this you would need to store buff or show it.
janfsd
i got this error when i put your code into my code. "The method getFromLocation(double, double, int) in the type Geocoder is not applicable for the arguments (String, String, int)" how do i solve the error? thanks!
KKC
Forgot about that. Change the 1st two to Double.valueOf(String);
janfsd
KKC
KKC