2014-12-02 137 views
1

我正在構建一個android應用程序,我正在使用TouchableWrapper類獲取緯度&經度。當用戶移開手指時,攝像機中心位置的緯度和經度將被解析並顯示在烤麪包中。 現在我需要的是那個latitude and longitude的地址。 這裏是我使用得到latitude and longitude代碼:如何從Android的緯度和經度獲取地址?

public class MainActivity extends FragmentActivity implements TouchActionDown, TouchActionUp { 
    CameraPosition mDownCameraPosition; 
    CameraPosition mUpCameraPosition; 
    ImageView submitbtn,mappoint; 
    String addressfixed,completed; 
    EditText whitebord; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_maintut); 

     // get data views 
     mappoint = (ImageView) findViewById(R.id.mappoint); 
     whitebord = (EditText) findViewById(R.id.searchmapedit); 
     mappoint.setImageResource(R.drawable.point); 
     submitbtn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       onBackPressed(); 
      } 
     }); 
     getMap().getMap().setMyLocationEnabled(true); 
     getMap().getMap().setOnMapLoadedCallback(
       new GoogleMap.OnMapLoadedCallback() { 
        @Override 
        public void onMapLoaded() { 
         Location myLocation = getMap().getMap().getMyLocation(); 
         LatLng myLatLng = new LatLng(myLocation.getLatitude(), 
           myLocation.getLongitude()); 

         CameraPosition myPosition = new CameraPosition.Builder() 
           .target(myLatLng).zoom(17).bearing(90).tilt(30) 
           .build(); 
         getMap().getMap().animateCamera(
           CameraUpdateFactory 
             .newCameraPosition(myPosition)); 
        } 
       }); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     // check google play services 
     int isAvailable = GooglePlayServicesUtil 
       .isGooglePlayServicesAvailable(this); 
     if (isAvailable != ConnectionResult.SUCCESS) { 
      GooglePlayServicesUtil.getErrorDialog(isAvailable, this, 1).show(); 
     } 
    } 

    @Override 
    public void onTouchDown(MotionEvent event) { 
     mDownCameraPosition = getMap().getMap().getCameraPosition(); 
    } 

     @Override 
    public void onTouchUp(MotionEvent event) { 
    mUpCameraPosition = getMap().getMap().getCameraPosition(); 
    getMap().getMap().clear();// to remove previous marker 
    MarkerOptions options = new MarkerOptions() 
      .title("This is your selected place to host game") 
      .position(
        new LatLng(mUpCameraPosition.target.latitude, 
          mUpCameraPosition.target.longitude)); 
    new GetAddressTask(getApplicationContext()).execute(); 

} 
private SupportMapFragment getMap() { 
    return ((SupportMapFragment) getSupportFragmentManager() 
      .findFragmentById(R.id.map)); 
} 

public class GetAddressTask extends AsyncTask<android.location.Location, Void, String> { 

    public GetAddressTask (Context context) { 
     super(); 
     mContext = context; 
    } 

    @Override 
    protected String doInBackground (android.location.Location... params) { 
     Geocoder geocoder = 
       new Geocoder(mContext, Locale.getDefault()); 
     android.location.Location location = params[0]; 
     Location markerLocation = getMap().getMap().getMyLocation(); 

     List<Address> addresses = null; 
     try { 
      if (mByMap && markerLocation != null) { 
       addresses = geocoder.getFromLocation(markerLocation.getLatitude(), 
         markerLocation.getLongitude(), 1); 
      } else if (!mByMap && location != null) { 
       addresses = geocoder.getFromLocation(mUpCameraPosition.target.latitude, 
         mUpCameraPosition.target.longitude, 1); 
      } 
     } catch (IOException exception) { 
      Log.e("ComplaintLocation", 
        "IO Exception in getFromLocation()", exception); 
    //    handler.post(new Runnable() { 
    // 
    //     @Override 
    //     public void run() { 
//      Toast.makeText(mContext, 
//        mContext.getString("Updating your location failed"), 
//        Toast.LENGTH_SHORT).show(); 
//     } 
//    }); 
      return ("IO Exception trying to get address"); 
     } catch (IllegalArgumentException exception) { 
      String errorString = "Illegal arguments " + 
        Double.toString(location.getLatitude()) + " , " + 
        Double.toString(location.getLongitude()) + " passed to address service"; 
      Log.e("LocationSampleActivity", errorString, exception); 

      return errorString; 
     } 

     if (addresses != null && addresses.size() > 0) { 
      Address address = addresses.get(0); 

      if (address.getMaxAddressLineIndex() > 0) { 
       return String.format(
         "%s/%s/%s/%s/%s/%s", 
         address.getLatitude(), // 0 
         address.getLongitude(), // 1 
         address.getThoroughfare(), // 2 
         address.getSubThoroughfare(), //3 
         address.getPostalCode(), // 4 
         address.getLocality()); // 5 
      } else { 
       return String.format(
         "%s/%s/%s/%s", 
         address.getLatitude(), // 0 
         address.getLongitude(), // 1 
         address.getPostalCode(), // 2 
         address.getLocality()); // 3 
      } 
     } else return "No address found"; 
    } 

    // Format address string after lookup 
    @Override 
    protected void onPostExecute (String address) { 

     String[] addressFields = TextUtils.split(address, "/"); 
     Log.d("ADDRESS ARRAY", Arrays.toString(addressFields)); 
    //   Log.d("LOCATION", "Using " + mProvider); 

     // Workaround: doInBackground can only return Strings instead of, for example, an 
     // Address instance or a String[] directly. To be able to use TextUtils.isEmpty() 
     // on fields returned by this method, set each String that currently reads "null" to 
     // a null reference 
     for (int fieldcnt = 0; fieldcnt < addressFields.length; ++fieldcnt) { 
      if (addressFields[fieldcnt].equals("null")) 
       addressFields[fieldcnt] = null; 
     } 

     String mStreet,mHouseNumber,mLatitude,mLongtitude,mPostalCode,mCity; 
     switch (addressFields.length) { 
      case 4: 
       mStreet = null; 
       mHouseNumber = null; 
       mLatitude = addressFields[0]; 
       mLongtitude = addressFields[1]; 
       mPostalCode = addressFields[2]; 
       mCity = addressFields[3]; 
       break; 
      case 6: 
       mLatitude = addressFields[0]; 
       mLongtitude = addressFields[1]; 
       mStreet = addressFields[2]; 
       mHouseNumber = addressFields[3]; 
       mPostalCode = addressFields[4]; 
       mCity = addressFields[5]; 
       break; 
      default: 
       mLatitude = null; 
       mLongtitude = null; 
       mStreet = null; 
       mHouseNumber = null; 
       mPostalCode = null; 
       mCity = null; 
       break; 
     } 
     Toast.makeText(getApplicationContext(), mStreet, 
        Toast.LENGTH_LONG).show(); 
    } 
} 


private boolean mByMap; 

// Lookup address via reverse geolocation 
public void lookUpAddress (boolean byMap) { 
    mByMap = byMap; 
    if (Geocoder.isPresent()) { 
//   (new GetAddressTask(mContext)).execute(mCurrentBestLocation); 
    } 
} 

    private SupportMapFragment getMap() { 
     return ((SupportMapFragment) getSupportFragmentManager() 
       .findFragmentById(R.id.map)); 
    } 
} 

任何幫助將不勝感激。

+0

檢查此代碼:http://stackoverflow.com/a/9409229/2065418 – 2014-12-02 08:22:17

+0

@DamienR。讓我檢查並找回你..謝謝 – Hitesh 2014-12-02 08:23:58

+0

@DamienR。錯誤 - 不幸的應用程序已停止..您可以請幫忙 – Hitesh 2014-12-02 08:30:47

回答

3

可以使用解析器針對通過在Android開發者指南描述提供緯度和經度找到一個位置的目的地址:Displaying a Location Address

因爲我已經很難找到它,當我最近在尋找它:你可以通過使用AddressgetThoroughfare(和getSubThoroughfare)getter方法獲得街道。


創建一個新類GeoLocation,複製以下到它:

package com.stackoverflow.hitesh.geocoder; 

import android.content.Context; 
import android.location.Address; 
import android.location.Geocoder; 
import android.location.Location; 
import android.os.AsyncTask; 
import android.text.TextUtils; 
import android.util.Log; 

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

public class GeoLocation { 

    private Context mContext; 

    private String mLatitude; 
    private String mLongtitude; 
    private String mStreet; 
    private String mHouseNumber; 
    private String mPostalCode; 
    private String mCity; 

    private Location mMarkerLocation; 

    public GeoLocation (Context context) { 
     mContext = context; 
    } 

    public String getStreet() { 
     return mStreet; 
    } 

    public String getHouseNumber() { 
     return mHouseNumber; 
    } 

    public String getPostalCode() { 
     return mPostalCode; 
    } 

    public String getCity() { 
     return mCity; 
    } 

    public String getLatitude() { 
     return mLatitude; 
    } 

    public String getLongtitude() { 
     return mLongtitude; 
    } 

    // Lookup address via reverse geolocation 
    // Call this one 
    public void lookUpAddress (Location markerLocation) { 
     mMarkerLocation = markerLocation; 
     if (Geocoder.isPresent()) { 
      (new GetAddressTask(mContext)).execute(); 
     } 
    } 

    public class GetAddressTask extends AsyncTask<android.location.Location, Void, String> { 

     public GetAddressTask (Context context) { 
      super(); 
      mContext = context; 
     } 

     @Override 
     protected String doInBackground (android.location.Location... params) { 
      Geocoder geocoder = 
        new Geocoder(mContext, Locale.getDefault()); 
      android.location.Location location = params[0]; 

      List<Address> addresses = null; 
      try { 
       if (mMarkerLocation != null) { 
        addresses = geocoder.getFromLocation(mMarkerLocation.getLatitude(), 
          mMarkerLocation.getLongitude(), 1); 
       } 
      } catch (IOException exception) { 
       Log.e("ComplaintLocation", 
         "IO Exception in getFromLocation()", exception); 

       return ("IO Exception trying to get address"); 
      } catch (IllegalArgumentException exception) { 
       String errorString = "Illegal arguments " + 
         Double.toString(location.getLatitude()) + " , " + 
         Double.toString(location.getLongitude()) + " passed to address service"; 
       Log.e("LocationSampleActivity", errorString, exception); 

       return errorString; 
      } 

      if (addresses != null && addresses.size() > 0) { 
       Address address = addresses.get(0); 

       if (address.getMaxAddressLineIndex() > 0) { 
        return String.format(
          "%s/%s/%s/%s/%s/%s", 
          address.getLatitude(), // 0 
          address.getLongitude(), // 1 
          address.getThoroughfare(), // 2 
          address.getSubThoroughfare(), //3 
          address.getPostalCode(), // 4 
          address.getLocality()); // 5 
       } else { 
        return String.format(
          "%s/%s/%s/%s", 
          address.getLatitude(), // 0 
          address.getLongitude(), // 1 
          address.getPostalCode(), // 2 
          address.getLocality()); // 3 
       } 
      } else return "No address found"; 
     } 

     // Format address string after lookup 
     @Override 
     protected void onPostExecute (String address) { 

      String[] addressFields = TextUtils.split(address, "/"); 
      Log.d("ADDRESS ARRAY", Arrays.toString(addressFields)); 

      // Workaround: doInBackground can only return Strings instead of, for example, an 
      // Address instance or a String[] directly. To be able to use TextUtils.isEmpty() 
      // on fields returned by this method, set each String that currently reads "null" to 
      // a null reference 
      for (int fieldcnt = 0; fieldcnt < addressFields.length; ++fieldcnt) { 
       if (addressFields[fieldcnt].equals("null")) 
        addressFields[fieldcnt] = null; 
      } 

      switch (addressFields.length) { 
       case 4: 
        mStreet = null; 
        mHouseNumber = null; 
        mLatitude = addressFields[0]; 
        mLongtitude = addressFields[1]; 
        mPostalCode = addressFields[2]; 
        mCity = addressFields[3]; 
        break; 
       case 6: 
        mLatitude = addressFields[0]; 
        mLongtitude = addressFields[1]; 
        mStreet = addressFields[2]; 
        mHouseNumber = addressFields[3]; 
        mPostalCode = addressFields[4]; 
        mCity = addressFields[5]; 
        break; 
       default: 
        mLatitude = null; 
        mLongtitude = null; 
        mStreet = null; 
        mHouseNumber = null; 
        mPostalCode = null; 
        mCity = null; 
        break; 
      } 

      Log.d("GeoLocation Street", mStreet); 
      Log.d("GeoLocation No.", mHouseNumber); 
      Log.d("GeoLocation Postalcode", mPostalCode); 
      Log.d("GeoLocation Locality", mCity); 
      Log.d("GeoLocation Lat/Lng", "[" + mLatitude + ", " + mLongtitude + "]"); 
     } 
    } 
} 

然後,使用

GeoLocation geoLocation = new GeoLocation(getActivity()); // or (this) if called from an activity and not from a fragment 
mGeoLocation.lookUpAddress(LOCATION_FROM_MAP); 

當然實例化它,你必須與定位對象,以取代LOCATION_FROM_MAP你從你的地圖上得到。

+0

評論是不適用於擴展討論;這個談話已經[轉移到聊天](http://chat.stackoverflow.com/rooms/66024/discussion-on-answer-by-pattafeufeu-how-to-get-address-from-latitude-and-longitu) 。 – Taryn 2014-12-02 11:29:44

+0

@bluefeet我收到一封通知,說Hitesh沒有加入聊天室所必需的最低信譽,這就是爲什麼我沒有移動聊天的原因。 – PattaFeuFeu 2014-12-02 11:32:40

+1

由於我移動了評論,他們應該可以聊天。 – Taryn 2014-12-02 11:46:25

5

您可以通過獲取地址GeoCoder對象 請注意,您將收到建議地址列表。 在這裏,在例如我採取的第一個

Geocoder geocoder; 
List<Address> yourAddresses; 
geocoder = new Geocoder(this, Locale.getDefault()); 
yourAddresses= geocoder.getFromLocation(yourLatitude, yourLongitude, 1); 

if (yourAddress.size() > 0) 
{ 
String yourAddress = yourAddresses.get(0).getAddressLine(0); 
String yourCity = yourAddresses.get(0).getAddressLine(1); 
String yourCountry = yourAddresses.get(0).getAddressLine(2); 
} 
+0

你可以請幫助解決這個問題mUpCameraPosition.target.longitude。我是新的android – Hitesh 2014-12-02 08:35:40

+0

嗨,有些時候地理編碼器沒有重新調整任何值,你知道它爲什麼會發生嗎? – DKV 2015-12-01 06:45:57

1

使用這種代碼,用於將緯度和longitute,以解決照相機變化

@Override 
public void onCameraChange(CameraPosition cameraPosition) 
{ 
    mGoogleMap.setOnMapLoadedCallback(this); 
} 


    @Override 
public void onMapLoaded() 
{ 
    LatLng position = mGoogleMap.getCameraPosition().target; 
    double Lat = position.latitude; 
    double Long = position.longitude; 

    Geocoder geocoder; 
    List<Address> addresses; 
    geocoder = new Geocoder(getApplicationContext(), Locale.getDefault()); 
    try 
     { 
     addresses = geocoder.getFromLocation(Lat, Long, 1); 
     if (addresses != null && addresses.size() > 0) 
     { 
      String address = addresses.get(0).getAddressLine(0); 
      String address11 = addresses.get(0).getAddressLine(1); 
      String city = addresses.get(0).getLocality(); 
     } 
     } 
     catch (IOException e) { 
     } 
    } 

和地圖負荷後調用onCameraChangeListener在onMapReady

mGoogleMap.setOnCameraChangeListener(this);