2016-06-17 21 views
5

私は場所を取得するためにプレイスピッカーの意図を使用しています。今、私は住所を国、都市、ピンコード、州のように区切って保存したいと思います。どのように私は場所のピッカーのアドレスからすべてを得ることができますか?場所ピッカーの住所から国、都市を取得するにはどうすればよいですか?

コード:

public class NameOfBusinessFragment extends Fragment { 

    int PLACE_PICKER_REQUEST = 1; 
    int RESULT_OK = -1; 
    PlacePicker.IntentBuilder builder = new PlacePicker.IntentBuilder(); 
    EditText category,location; 

     @Override 
     public View onCreateView(LayoutInflater inflater, ViewGroup container, 
           Bundle savedInstanceState) { 
      View view = inflater.inflate(R.layout.fragment_name_of_business, 
        container, false); 

      location = (EditText)view.findViewById(R.id.location); 

      location.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 

        try { 

         startActivityForResult(builder.build(getActivity()), PLACE_PICKER_REQUEST); 
        } 
        catch (GooglePlayServicesRepairableException e) 
        { 
         Toast.makeText(getActivity(),"ServiceRepaire Exception",Toast.LENGTH_SHORT).show(); 
        } 
        catch (GooglePlayServicesNotAvailableException e) 
        { 
         Toast.makeText(getActivity(),"SeerviceNotAvailable Exception",Toast.LENGTH_SHORT).show(); 
        } 
       } 
      }); 

      return view; 
     } 
    public void onActivityResult(int requestCode, int resultCode, Intent data) { 
     if (requestCode == PLACE_PICKER_REQUEST) { 
      if (resultCode == RESULT_OK) { 
       Place place = PlacePicker.getPlace(data, getActivity()); 
       String toastMsg = String.format("Place: %s", place.getName()); 


       Toast.makeText(getActivity(), toastMsg, Toast.LENGTH_LONG).show(); 
       location.setText(place.getName()); 
      } 
     } 
    } 
} 

これは私が場所ピッカーを実装し、地名をonActivityResult取得する方法です。逆ジオコードなどを使用してこれを取得できますか?誰も私を助けてくれますか?ありがとうございました。

答えて

2

Placeクラスを直接使用することはできないと思いますが、緯度と経度からGoogleに問い合わせることができます。あなたのonActivityResult方法の一例下:あなたの問題を解決するために

public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    if (requestCode == PLACE_PICKER_REQUEST) { 
     if (resultCode == RESULT_OK) { 
      // get place data 
      Place place = PlacePicker.getPlace(data, getActivity()); 

      // ask for geolocation data 
      Geocoder gcd = new Geocoder(this, Locale.getDefault()); 
      List<Address> addresses = null; 
      try { 
       addresses = gcd.getFromLocation(place.getLatLng().latitude, place.getLatLng().longitude, 1); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
      if (addresses.size() > 0) { 
       String toastMsg = String.format("Place: %s", addresses.get(0).getLocality() + " - " + addresses.get(0).getCountryName() + " - " + addresses.get(0).getCountryCode()); 
       Toast.makeText(getActivity(), toastMsg, Toast.LENGTH_LONG).show(); 


       // NOW SET HERE CORRECT DATA 
       //location.setText(place.getName()); 

      } 
     } 
    } 
} 
+0

Geocoderは信頼性がありません。ほとんどの場合、nullを返します。 –

0

最善の方法あなたがこの問題を回避する、次のそれを使用したくない場合は、あなたを助けるかもしれない何らかの理由により緯度と経度からではなく、場合アドレスを取得するためにGeocoderを使用しています。

信頼できない100%信頼性ですが、Googleがこれらの詳細情報を提供するまで使用できます。ランダムなケースでは完璧な結果を得られない場合がありますが、ほとんどの場合は機能します。

public void getAddressDetails(Place place) { 
     if (place.getAddress() != null) { 
      String[] addressSlice = place.getAddress().toString().split(", "); 
      country = addressSlice[addressSlice.length - 1]; 
      if (addressSlice.length > 1) { 
       String[] stateAndPostalCode = addressSlice[addressSlice.length - 2].split(" "); 
       if (stateAndPostalCode.length > 1) { 
        postalCode = stateAndPostalCode[stateAndPostalCode.length - 1]; 
        state = ""; 
        for (int i = 0; i < stateAndPostalCode.length - 1; i++) { 
         state += (i == 0 ? "" : " ") + stateAndPostalCode[i]; 
        } 
       } else { 
        state = stateAndPostalCode[stateAndPostalCode.length - 1]; 
       } 
      } 
      if (addressSlice.length > 2) 
       city = addressSlice[addressSlice.length - 3]; 
      if (addressSlice.length == 4) 
       stAddress1 = addressSlice[0]; 
      else if (addressSlice.length > 3) { 
       stAddress2 = addressSlice[addressSlice.length - 4]; 
       stAddress1 = ""; 
       for (int i = 0; i < addressSlice.length - 4; i++) { 
        stAddress1 += (i == 0 ? "" : ", ") + addressSlice[i]; 
       } 
      } 
     } 
     if(place.getLatLng()!=null) 
     { 
      latitude = "" + place.getLatLng().latitude; 
      longitude = "" + place.getLatLng().longitude; 
     } 
    } 
0

Placeオブジェクトのアドレス(ストリート、都市、国など)のコンポーネントを区切りたい場合は、2つのオプションがあります。

  1. Place.getLatLng()を使用してください。次に、緯度と経度を逆ジオコーディングします。
  2. アドレスを解析します。

ここで、アドレスの解析はあまり簡単ではありません。しかし、緯度と経度の逆ジオコーディングは正確ではありません。私はアドレスを解析することをお勧めします。そこには優れたアドレス解析サービスがあり、アドレスデータベースに対してアドレスを検証するものもあります。なぜ逆の(私はSmartyStreetsを示唆している。あなたはSmartyStreets demoページに行く場合は、ドロップダウンから「自由形式のアドレス」を選択し、次にあなたがアドレスを検索するときに戻ってくる情報の種類を参照。)


ここでは、ジオコーディングが貧弱な解決策である可能性があります。ジオコードを逆にすると、緯度と経度を取り、それをアルゴリズムに基づいてアドレスに対応させます。一部のアルゴリズムは、緯度と経度を最も近い実アドレスに一致させます。この場合、住所はあなたの住所の住所ではない可能性があります。一方、いくつかのアルゴリズムは、緯度と経度に合理的に適合するアドレスに近似しています。この場合、アドレスは実アドレスでなくてもよい。別の合併症はgetLatLng()ためthe documentationに記載されている:

位置は、必ずしも場所の中心、または任意の特定のエントリまたは終了点が、場所の地理的範囲内のいくつかの任意に選択された点ではありません。

緯度と経度は場所の地理的範囲内の任意の点であるため、信頼性の高い逆ジオコーディングアルゴリズムを作成することは困難です。

しかし、正確性について気にする必要はありません。それが "十分に近い"アドレスを希望している場合は、逆ジオコーディングが適しています。


注意すべきもう一つのこと:

静的な場所getPlace(テントの意図、コンテキストコンテキスト) このメソッドは廃止されました。代わりにgetPlace(Context、Intent)を使用してください。

は、私はあなたの行を置き換えるべきだと思います。これで

Place place = PlacePicker.getPlace(data, getActivity()); 

Place place = PlacePicker.getPlace(getActivity(), data); 

全開示を:私はSmartyStreetsのために働きます。

関連する問題