2013-08-14 7 views
19

Sto lavorando con Android Studio e in una finestra di dialogo popup voglio che gli utenti possano ottenere la loro posizione, ma tutto quello che so di fare è ottenere la mia latitudine e longitudine.come posso ottenere il nome della città della mia posizione attuale?

Questo è il codice

import android.app.Activity; 
import android.content.Context; 
import android.location.Criteria; 
import android.location.Location; 
import android.location.LocationListener; 
import android.location.LocationManager; 
import android.os.Bundle; 
import android.widget.TextView; 
import android.widget.Toast; 

public class MainActivity extends Activity implements LocationListener { 
    private TextView latituteField; 
    private TextView longitudeField; 
    private LocationManager locationManager; 
    private String provider; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     latituteField = (TextView) findViewById(R.id.TextView02); 
     longitudeField = (TextView) findViewById(R.id.TextView04); 


     locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

     Criteria criteria = new Criteria(); 
     provider = locationManager.getBestProvider(criteria, false); 
     Location location = locationManager.getLastKnownLocation(provider); 


     if (location != null) { 
      System.out.println("Provider " + provider + " has been selected."); 
      onLocationChanged(location); 
     } else { 
      latituteField.setText("Location not available"); 
      longitudeField.setText("Location not available"); 
     } 
    } 


    @Override 
    protected void onResume() { 
     super.onResume(); 
     locationManager.requestLocationUpdates(provider, 400, 1, this); 
    } 


    @Override 
    protected void onPause() { 
     super.onPause(); 
     locationManager.removeUpdates(this); 
    } 

    @Override 
    public void onLocationChanged(Location location) { 
     int lat = (int) (location.getLatitude()); 
     int lng = (int) (location.getLongitude()); 
     latituteField.setText(String.valueOf(lat)); 
     longitudeField.setText(String.valueOf(lng)); 
    } 

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


    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     Toast.makeText(this, "Enabled new provider " + provider, 
       Toast.LENGTH_SHORT).show(); 

    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     Toast.makeText(this, "Disabled provider " + provider, 
       Toast.LENGTH_SHORT).show(); 
    } 
} 

nel MainActivity.Can mi potete aiutare?

Ho aggiunto questo nel manifesto

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> 
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION"/> 

ma si dice ancora "Posizione non disponibile".


+0

per nome intendi Indirizzo? – Nerd

+0

si intendo la città: esempio. Florence – Rick

risposta

27

È necessario la classe GeoCoder per ottenere Address da un determinato Lat/Long. provare quanto segue:

Geocoder geoCoder = new Geocoder(this, Locale.getDefault()); //it is Geocoder 
StringBuilder builder = new StringBuilder(); 
try { 
    List<Address> address = geoCoder.getFromLocation(latitude, longitude, 1); 
    int maxLines = address.get(0).getMaxAddressLineIndex(); 
    for (int i=0; i<maxLines; i++) { 
    String addressStr = address.get(0).getAddressLine(i); 
    builder.append(addressStr); 
    builder.append(" "); 
    } 

String fnialAddress = builder.toString(); //This is the complete address. 
} catch (IOException e) {} 
    catch (NullPointerException e) {} 

codice qui sotto dovrebbe funzionare per voi: (Controllare i commenti in linea per quanto riguarda il codice)

import java.io.IOException; 
import java.util.List; 
import java.util.Locale; 

import android.app.Activity; 
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 android.widget.Toast; 

public class MainActivity extends Activity implements LocationListener { 
private TextView latituteField; 
private TextView longitudeField; 
private TextView addressField; //Add a new TextView to your activity_main to display the address 
private LocationManager locationManager; 
private String provider; 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    latituteField = (TextView) findViewById(R.id.TextView02); 
    longitudeField = (TextView) findViewById(R.id.TextView04); 
    addressField = (TextView) findViewById(R.id.TextView05); //Make sure you add this to activity_main 


    locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); 

    Criteria criteria = new Criteria(); 
    provider = locationManager.getBestProvider(criteria, false); 
    Location location = locationManager.getLastKnownLocation(provider); 


    if (location != null) { 
     System.out.println("Provider " + provider + " has been selected."); 
     onLocationChanged(location); 
    } else { 
     latituteField.setText("Location not available"); 
     longitudeField.setText("Location not available"); 
    } 
} 


@Override 
protected void onResume() { 
    super.onResume(); 
    locationManager.requestLocationUpdates(provider, 400, 1, this); 
} 


@Override 
protected void onPause() { 
    super.onPause(); 
    locationManager.removeUpdates(this); 
} 

@Override 
public void onLocationChanged(Location location) { 
    //You had this as int. It is advised to have Lat/Loing as double. 
    double lat = location.getLatitude(); 
    double lng = location.getLongitude(); 

    Geocoder geoCoder = new Geocoder(this, Locale.getDefault()); 
    StringBuilder builder = new StringBuilder(); 
    try { 
     List<Address> address = geoCoder.getFromLocation(lat, lng, 1); 
     int maxLines = address.get(0).getMaxAddressLineIndex(); 
     for (int i=0; i<maxLines; i++) { 
      String addressStr = address.get(0).getAddressLine(i); 
      builder.append(addressStr); 
      builder.append(" "); 
     } 

     String fnialAddress = builder.toString(); //This is the complete address. 

     latituteField.setText(String.valueOf(lat)); 
     longitudeField.setText(String.valueOf(lng)); 
     addressField.setText(fnialAddress); //This will display the final address. 

    } catch (IOException e) { 
     // Handle IOException 
    } catch (NullPointerException e) { 
     // Handle NullPointerException 
    } 
} 

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


} 

@Override 
public void onProviderEnabled(String provider) { 
    Toast.makeText(this, "Enabled new provider " + provider, 
      Toast.LENGTH_SHORT).show(); 

} 

@Override 
public void onProviderDisabled(String provider) { 
    Toast.makeText(this, "Disabled provider " + provider, 
      Toast.LENGTH_SHORT).show(); 
} 
} 
+0

@ user2675569: controlla la mia risposta modificata. – Nerd

+0

Non so perché, ma non funziona! Quando lancio l'app sul mio telefono dice "Sfortunatamente, la mia applicazione si è fermata". Per te funziona? – Rick

+0

Post the Logcat – Nerd

11

È necessario eseguire il geocoder in un AysncTask (o in un thread non nello stesso ThreadGroup come il thread UI)!

public void getCityName(final Location location, final OnGeocoderFinishedListener listener) { 
    new AsyncTask<Void, Integer, List<Address>>() { 
     @Override 
     protected List<Address> doInBackground(Void... arg0) { 
     Geocoder coder = new Geocoder(getContext(), Locale.ENGLISH); 
     List<Address> results = null; 
     try { 
      results = coder.getFromLocation(location.getLatitude(), location.getLongitude(), 1); 
     } catch (IOException e) { 
      // nothing 
     } 
     return results; 
     } 

     @Override 
     protected void onPostExecute(List<Address> results) { 
     if (results != null && listener != null) { 
      listener.onFinished(results); 
     } 
     } 
    }.execute(); 
} 

Con questo Listener astratto

public abstract class OnGeocoderFinishedListener { 
    public abstract void onFinished(List<Address> results); 
} 

Ora chiamare il metodo come questo:

getCityName(location, new OnGeocoderFinishedListener() { 
    @Override 
    public void onFinished(List<Address> results) { 
     // do something with the result 
    } 
}); 

Spero che questo vi aiuterà alcuni di voi!