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: