WiFi 및 Network 상태에 대한 정보가 필요한 경우가 있습니다. 필자는 기존에 브로드캐스트를 등록하고 상태를 수신하여 활용하고 있었습니다. 그런데 NetworkInfo deprecated 를 확인하였고,  이에 대한 대응으로 아래와 같이 정...

[안드로이드] WiFi 및 네트워크 상태 확인 (+NetworkInfo deprecated)

 

WiFi 및 Network 상태에 대한 정보가 필요한 경우가 있습니다.

필자는 기존에 브로드캐스트를 등록하고 상태를 수신하여 활용하고 있었습니다.

그런데 NetworkInfo deprecated 를 확인하였고, 

이에 대한 대응으로 아래와 같이 정리하려고 합니다.

 



1. (Old) WiFi 및 네트워크 상태 확인

기존에 아래와 같이 리시버를 정의해주고 등록하여  WiFi 및 네트워크 상태를 확인하였습니다.

Network 상태 변화를 수신하는 부분에서 NetworkInfo 에 취소선이 표시됩니다.

API29 이상부터 더 이상 사용하지 않는다고 합니다. (NetworkInfo deprecated)


receiver 정의

private var receiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
WifiManager.WIFI_STATE_CHANGED_ACTION -> {

// WiFi 상태 변화 감지
when (intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_UNKNOWN)) {
WifiManager.WIFI_STATE_DISABLING -> Log.d("WiFi", "WIFI_STATE_DISABLING")
WifiManager.WIFI_STATE_DISABLED -> Log.d("WiFi", "WIFI_STATE_DISABLED")
WifiManager.WIFI_STATE_ENABLING -> Log.d("WiFi", "WIFI_STATE_ENABLING")
WifiManager.WIFI_STATE_ENABLED -> Log.d("WiFi", "WIFI_STATE_ENABLED")
else -> Log.d("WiFi", "unknown")
}
}
WifiManager.NETWORK_STATE_CHANGED_ACTION -> {

// 네트워크 상태 변화 감지 (NetworkInfo deprecated API29)
val info: NetworkInfo? = intent.getParcelableExtra<Parcelable>(WifiManager.EXTRA_NETWORK_INFO) as NetworkInfo?
val state: NetworkInfo.DetailedState? = info?.detailedState
state?.let {
when (state) {
NetworkInfo.DetailedState.CONNECTED -> Log.d("Network", "connected")
NetworkInfo.DetailedState.DISCONNECTED -> Log.d("Network", "disconnected")
else -> { }
}
}
}
}
}
}


receiver 등록

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val filter = IntentFilter()
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION)
registerReceiver(receiver, filter)
}



2. NetworkInfo deprecated

안드로이드 문서를 살짝 확인해보면 NetworkInfo API 29부터 사용하지 않고,

ConnectivityManager NetworkCallback 에 대해 알아보라고 얘기해주고 있습니다.




3. (New) WiFi 및 네트워크 상태 확인

기존에 리시버에 정의한 Network 상태 감지를 빼고, 

NetworkCallback 을 대체하여 사용하도록 변경하였습니다.


AndroidManifest permission 등록

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />


receiver 정의

private var receiver: BroadcastReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
when (intent.action) {
WifiManager.WIFI_STATE_CHANGED_ACTION -> {

// WiFi 상태 변화 감지
when (intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE,WifiManager.WIFI_STATE_UNKNOWN)) {
WifiManager.WIFI_STATE_DISABLING -> Log.d("WiFi", "WIFI_STATE_DISABLING")
WifiManager.WIFI_STATE_DISABLED -> Log.d("WiFi", "WIFI_STATE_DISABLED")
WifiManager.WIFI_STATE_ENABLING -> Log.d("WiFi", "WIFI_STATE_ENABLING")
WifiManager.WIFI_STATE_ENABLED -> Log.d("WiFi", "WIFI_STATE_ENABLED")
else -> Log.d("WiFi", "unknown")
}
}
}
}
}


networkCallback 정의

private val networkCallback = object : ConnectivityManager.NetworkCallback() {

// 네트워크 상태 변화 감지
override fun onAvailable(network: Network) {
Log.d("network", "onAvailable")
}

override fun onLost(network: Network) {
Log.d("network", "onLost")
}
}


receiver 및 networkCallback 등록

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

val filter = IntentFilter()
filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION)
registerReceiver(receiver, filter)

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val cm = getSystemService(ConnectivityManager::class.java)
val wifiNetworkRequest = NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
cm.registerNetworkCallback(wifiNetworkRequest, networkCallback)
}
}



[참고자료]

https://developer.android.com/reference





0 comments: