Androidで郵便番号から住所を取得したいと思ったことはないでしょうか。
私はあります。
さて、Geocoderを使用して住所を取得していきたいと思います。
検証環境
Pixcel 3a
Api 28
画面作成
content_main.xml
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:context=".MainActivity"
tools:showIn="@layout/activity_main">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingStart="10dp"
android:paddingEnd="10dp"
android:orientation="vertical"
android:layout_centerInParent="true">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<EditText
android:id="@+id/zip_code1"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:inputType="number"
android:maxLength="3"/>
<EditText
android:id="@+id/zip_code2"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="5dp"
android:inputType="number"
android:maxLength="4"/>
<Button
android:id="@+id/search_button"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_marginStart="5dp"
android:text="検索"/>
</LinearLayout>
<TextView
android:id="@+id/result"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:gravity="center"
android:textSize="24dp"/>
</LinearLayout>
</RelativeLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
検索ボタンが押下されたら入力された郵便番号を元に住所を検索します
検索処理
MainActivity.kt
private fun searchAddressFromZipCode(zipCode: String): Address? {
if (zipCode.length != 8) {
return null
}
val geocoder = Geocoder(this, Locale.JAPAN)
val address = geocoder.getFromLocationName(zipCode, 1)
if (address != null && address.size != 0) {
val latitude = address[0].latitude
val longitude = address[0].longitude
val addressList = geocoder.getFromLocation(latitude, longitude, 100)
val filteredList = addressList.filter { x -> x.latitude == latitude && x.longitude == longitude }
val sortedList = filteredList.sortedBy { x -> x.getAddressLine(0).length }
sortedList.forEach { temp ->
if (!temp.featureName.equals(zipCode)) {
return temp
}
}
return if (addressList.isEmpty()) address[0] else addressList[0]
}
return null
}
結果
上記コードで期待した住所が得られる場合もありますが、住所のデータが更新されていないのか一部正しく取得できない郵便番号がありました。(089-4324など)
郵便番号は町や村の統廃合で変更されうるものなので、下記の日本郵便が配布している郵便番号データを取り込んでそのデータを元に住所取得処理を実装するのが良いと思います。
郵便番号データダウンロードURL
Google Map Apiを使用する方法もあるようです。
便利すぎる!Google Maps APIで郵便番号から住所を取得する!サンプルそのまま使えます