728x90
원래는 getNetworkInfo 를 이용하여 네트워크 상태를 가져올 수 있다.
그런데 API29 에서 deprecated 되었다고 하여 새로운 방법을 찾아보았다.
class NetworkConnectionStateMonitor(context: Context) : ConnectivityManager.NetworkCallback() {
private var context: Context? = null
private var networkRequest: NetworkRequest? = null
private var connectivityManager: ConnectivityManager? = null
init {
this.context = context
this.networkRequest =
NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build()
}
fun register() {
connectivityManager =
context!!.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
connectivityManager!!.registerNetworkCallback(networkRequest!!, this)
}
fun unregister() {
connectivityManager!!.unregisterNetworkCallback(this)
}
override fun onAvailable(network: Network) {
super.onAvailable(network)
// Do what you need to do here
// 네트워크가 연결되었을 때 할 동작
Toast.showShort("network available")
}
override fun onLost(network: Network) {
super.onLost(network)
// Do what you need to do here
// 네트워크 연결이 끊겼을 때 할 동작
Toast.showShort("network lost")
}
}
lateinit var networkConnectionStateMonitor: NetworkConnectionStateMonitor
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
networkConnectionStateMonitor = NetworkConnectionStateMonitor(this)
networkConnectionStateMonitor.register()
}
override fun onDestroy() {
networkConnectionStateMonitor.unregister()
super.onDestroy()
}
생명주기에 네트워크 콜백을 등록하여 네트워크 상태 변경을 감지할 수 있다.
그런데 나는 사실 굳이 실시간으로 받아올 필요가 전혀 없었다.
스플래시 화면과 API call 하기 전에 확인이 필요할 뿐.. 실시간으로 연결이 끊어지는건 상관이 없다.
그래서 NetworkConnectionStateMonitor 클래스에 상태를 가져와서 확인할 수 있는 함수를 만들었다.
fun isNetworkAvailable(): Boolean {
val nw: Network = connectivityManager?.activeNetwork ?: return false
val actNw: NetworkCapabilities =
connectivityManager?.getNetworkCapabilities(nw) ?: return false
return when {
actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
Toast.showShort("wifi 연결됨")
true
}
actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
Toast.showShort("cellular 연결됨")
true
}
//for other device how are able to connect with Ethernet
actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
Toast.showShort("ethernet 연결됨")
true
}
//for check internet over Bluetooth
actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> {
Toast.showShort("bluetooth 연결됨")
true
}
else -> false
}
}
근데 그냥 getNetworkInfo 쓰면 안되는건가..ㅋㅋㅋ
'Kotlin > 안드로이드 공부' 카테고리의 다른 글
코루틴 플레이그라운드 - launch (0) | 2023.10.14 |
---|---|
Android 13 POST_NOTIFICATIONS 권한 (0) | 2023.03.31 |
안드로이드 Splash Screen Disable 처리 (0) | 2023.01.12 |
안드로이드12 Splash Screen (0) | 2023.01.12 |
Hilt @Provides vs @Binds (0) | 2022.06.10 |