Android 네트워크 : 스마트폰 정보 구하기

timothy jeong·2021년 11월 20일
0

Android with Kotlin

목록 보기
50/69

대부분 앱은 네트워크 통신을 이용해 서버에서 데이터를 가져와 화면에 출력하거나 앱에서 발생한 데이터를 서버에 넘겨서 저장한다. 때문에 HTTP 통신 방법과 기기의 각종 네트워크 정보를 확인하는 방법을 알아야한다.

네트워크 접속 정보

네트워크 접속 정보를 파악할 때는 ConnectivityManager 를 이용한다. 이를 이용하려면 먼저 퍼미션을 선언해야한다.

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

getActiveNetwork() 함수 이용

스마프톤에서 네트워크가 가능한지, 가능하다면 어떤 네트워크에 접속되었는지 알아볼 때는 ConnectivityManager 의 getActiveNetwork() 함수로 Network 객체를 얻어서 이용한다. 이 객체는 API 23 부터 제공되며, 23 미만의 비전까지도 고려한다면 ConnectivityManager 의 getActiveNetworkInfo() 함수를 이용해 NetworkInfo 객체를 얻어야 한다.

    private fun isNetwork():Boolean {
        val manger = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
            val nw = manger.activeNetwork ?: return false
            val actNw = manger.getNetworkCapabilities(nw) ?: return false
            return when {
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
                    Log.d("NETWORK", "WIFI available")
                    true
                }
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
                    Log.d("NETWORK", "CELLULAR available")
                    true
                }
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET) -> {
                    Log.d("NETWORK", "ETHERNET available")
                    true
                }
                actNw.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH) -> {
                    Log.d("NETWORK", "BLUETOOTH available")
                    true
                }
                else -> false
            }
        } else {
            return manger.activeNetworkInfo?.isConnected ?: false
        }
    }

requestNetwork() 함수 이용

getActiveNetwork() 함수 외에도 requestNetwork() 함수를 이용할 수 있다. 이 함수를 이용하려면 다른 퍼미션이 필요하다. requestNetwork() 함수는 API 21 부터 추가되었다. getActiveNetwork() 함수가 API 23에 도입된걸 고려한다면, 더 호환성이 좋다고 할 수 있다.

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

requestNetwork() 함수의 구조는 아래와 같다.

public void requestNetwork(NetworkRequest request, ConnectivityManager.NetworkCallback networkCallback) 

첫번째 매개변수로 NetworkRequest 객체를 지정하는데, NetworkRequest 의 addCapability() 와 addTransportType() 함수를 이용하면 네트워크 타입을 지정할 수 있다. 두번째 매개변수인 networkCallback 은 콜백 함수를 구현하여 request 에서 지정한 네트워크 타입이 연결되어있는지, 연결되어있지 않은지 확인할 수 있도록 한다.

   private fun isNetworkVer2() {
        val networkReq : NetworkRequest = NetworkRequest.Builder()
            .addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
            .addTransportType(NetworkCapabilities.TRANSPORT_ETHERNET)
            .addTransportType(NetworkCapabilities.TRANSPORT_BLUETOOTH)
            .build()
            
        manager.requestNetwork(networkReq, object: ConnectivityManager.NetworkCallback() {
            override fun onAvailable(network: Network) {
                super.onAvailable(network)
                Log.d("NETWORK", "Available")
            }

            override fun onUnavailable() {
                super.onUnavailable()
                Log.d("NETWORK", "UnAvailable")
            }
        })

기타 : 전화 정보

앱에서 전화 기능을 이용하려면 PhoneStateListener 를 상속받아 그 객체를 TelephonyManager에 등록해야 한다. 그러면 스마트폰의 전화 관련 상태가 바뀔 때마다 PhoneStateListener 의 함수가 자동으로 호출된다.

profile
개발자

0개의 댓글