Androidで郵便番号から住所を取得

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など)<br>
郵便番号は町や村の統廃合で変更されうるものなので、下記の日本郵便が配布している郵便番号データを取り込んでそのデータを元に住所取得処理を実装するのが良いと思います。
[郵便番号データダウンロードURL](https://www.post.japanpost.jp/zipcode/download.html)

Google Map Apiを使用する方法もあるようです。
[便利すぎる！Google Maps APIで郵便番号から住所を取得する！サンプルそのまま使えます](https://qiita.com/kenzooooo/items/e612671e592dc1d55f24)