2013-08-14 41 views
19

Tôi đang làm việc với studio android và trong hộp thoại bật lên, tôi muốn người dùng có thể nhận được vị trí của họ nhưng tất cả những gì tôi biết là có được vĩ độ và kinh độ của tôi.làm thế nào tôi có thể có được tên thành phố của vị trí hiện tại của tôi?

Đây là mã

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

trong MainActivity.Can bạn giúp tôi?

Tôi đã thêm này trong manifest

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

nhưng nó vẫn nói "Location không có sẵn".


+0

theo tên bạn có nghĩa là Địa chỉ? – Nerd

+0

vâng, ý tôi là thành phố: ví dụ. Florence – Rick

Trả lời

27

Bạn cần lớp GeoCoder để nhận Address từ một Lat/Long đã cho. hãy thử như sau:

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

Mã dưới đây sẽ làm việc cho bạn: (Kiểm tra các ý kiến ​​inline về mã của bạn)

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: kiểm tra câu trả lời đã chỉnh sửa của tôi. – Nerd

+0

Tôi không biết tại sao nhưng nó không hoạt động! Khi tôi khởi chạy ứng dụng trên điện thoại của tôi, nó nói "Rất tiếc, Ứng dụng của tôi đã ngừng". Nó làm việc cho bạn? – Rick

+0

Đăng Logcat – Nerd

11

Bạn cần phải thực hiện trong một Geocoder AysncTask (hoặc trong một chủ đề không có trong ThreadGroup tương tự như giao diện người dùng Thread)!

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

Với Listener trừu tượng này

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

Bây giờ gọi phương thức như thế này:

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

Hy vọng điều này sẽ giúp một số bạn!

Các vấn đề liên quan