2013-08-14 7 views
19

Pracuję z Androidem Studio iw wyskakującym oknie dialogowym Chcę, żeby użytkownicy mogli uzyskać swoją pozycję, ale wszystko, co wiem, to zrobić, by uzyskać swoją szerokość i długość geograficzną.jak mogę uzyskać nazwę miasta mojej aktualnej pozycji?

Jest to kod

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

w MainActivity.Can mi pomóc?

Dodałem to w oczywisty

<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"/> 

ale wciąż mówi „Lokalizacja niedostępna”.


+0

o nazwie oznacza adres? – Nerd

+0

tak mam na myśli miasto: przykład. Florence – Rick

Odpowiedz

27

Trzeba klasę GeoCoder dostać Address z danego Lat/długie. spróbuj wykonać następujące czynności:

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

Kod poniżej powinien pracować dla Ciebie: (Sprawdź inline komentarze dotyczące kodzie)

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: sprawdź moją zredagowaną odpowiedź. – Nerd

+0

Nie wiem dlaczego, ale to nie działa! Po uruchomieniu aplikacji na moim telefonie pojawia się komunikat "Niestety moja aplikacja została zatrzymana". Czy Ci to pasuje? – Rick

+0

Po Logcat – Nerd

11

Trzeba wykonać geocoder w AysncTask (lub w wątku nie w tym samym ThreadGroup jako wątek 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(); 
} 

Z tej abstrakcyjnej Listener

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

Teraz wywołujemy metodę tak:

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

nadzieję, że pomoże niektórzy z was!

Powiązane problemy