2010-01-18 37 views
7

Tôi đang viết một ứng dụng yêu cầu để có được vị trí bản đồ hiện tại. Tệp Bản đồ của tôi hoạt động tốt, nhưng tôi cần lấy địa chỉ (xem addressString bên dưới ở mông) từ một số Activity khác. Tôi đã thử getAddress/setAddress (người định cư/getters). Họ không làm việc. Họ luôn trả về 'không có địa chỉ' (mặc định).Nhận địa chỉ Bản đồ hoặc Địa chỉ Vị trí trong Android

Đây là mã của tôi ...

Làm thế nào tôi có thể biến nó thành một lớp Java độc lập ??? Hoặc lấy địa chỉ từ một hoạt động khác?

Cảm ơn rất nhiều.

Mã này tự hoạt động.

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; 
    } 
} 
+0

Bạn có nhận được bất kỳ lỗi? Bởi vì mã bạn có là hoàn toàn đúng, tôi đã sử dụng trong ứng dụng của tôi và làm việc tốt cho tôi. Nếu bạn có một số lỗi, vui lòng đăng nhật ký lỗi. – Scorpion

+0

Geocoder gc = new Geocoder (điều này, Locale.getDefault()); thay vì điều này, hãy thử cái này. Geocoder gc = new Geocoder (youractivityclassname.this.getApplicationContext(), Locale.getDefault()); – Scorpion

Trả lời

0

Hoặc qua địa chỉ để thứ hai Activity của bạn trong Intent, hoặc nếu bạn cần làm tra cứu từ thứ hai của bạn Activity, chỉ cần gọi Geocoder từ đó.

Nếu bạn bằng cách nào đó đã khởi tạo lớp học trên (GetMapActivity) từ số Activity thứ hai và gọi phương thức getAddress, điều đó sẽ không hoạt động.

0

Sau đây có thể làm việc [di chuyển mã từ onCreate và đặt nó trong một phương pháp]

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; 
    } 
10

Tôi đã sử dụng đoạn mã sau vào ứng dụng của tôi và làm việc của nó hoàn toàn tốt cho tôi. Thử cái này. Hy vọng điều này sẽ giúp bạn.

// 
    // 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 
    } 
+0

điều này ném "Tài nguyên dịch vụ của Google Play không được tìm thấy. Hãy kiểm tra cấu hình dự án của bạn để đảm bảo rằng các tài nguyên được bao gồm." – alicanbatur

+0

nó hoạt động cho tôi! – Coeus

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