API31からWifiManager経由の自分のAndroidのIPアドレス取得が非推奨になりました。そのままのコードでもとりあえず動作するようですけど、修正するとしたら次のようにConnectivityManagerを使うようにする必要があります。
API 31以前のWifiManagerによるIPアドレスの取得
val manager: WifiManager =this.applicationContext.getSystemService(WIFI_SERVICE) as WifiManager
val ip = manager.connectionInfo.ipAddress
Log.i(TAG,arrayOf<Int>(ip,ip shr 8,ip shr 16,ip shr 24).map{it and 0xff}.joinToString("."))
IPはIntで取得されるので、1バイトずつ分割して表示しています。例えば192.168.1.1のように表示されます。
API 31 以降の場合
build.gradle(app)のcompileSdkが31以上となると、
build.gradle(app)
compileSdk 31
以下のように、ConnectivityManagerを取得してコールバックを設定し、コールバック関数のonLinkPropertiesChanged内でIPを取得します。以下のコードはIPv4の最初のアドレスを取得しています。
val manager:ConnectivityManager = this.applicationContext.getSystemService(CONNECTIVITY_SERVICE) as ConnectivityManager
val networkCallback = object: ConnectivityManager.NetworkCallback() {
override fun onLinkPropertiesChanged(network: Network, linkProperties: LinkProperties) {
super.onLinkPropertiesChanged(network, linkProperties)
Log.i(TAG,linkProperties.linkAddresses.filter{
it.address is Inet4Address
}[0].toString())
}
}
manager.registerDefaultNetworkCallback(networkCallback)
LinkAddressを文字化しているので例えば192.168.1.1/16のようにサブネットマスクも表示されます。
AndroidManifest.xmlでの許可項目の変更
またWifiManagerのときに以下のようにAndroidManifest.xmlでACCESS_WIFI_STATEに対してパーミッションを与えていたところを、ACCESS_NETWORK_STATEに変更する必要があります。
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
↑を、↓に変更する。
AndroidManifest.xml
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />