『Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린』 교재를 바탕으로 정리한 내용입니다.
onServiceStateChanged()
: 단말기의 서비스 상태 변경onCallStateChanged()
: 통화 상태 변경 val phoneStateListener = object : PhoneStateListener() {
// 단말기의 서비스 상태 변경 함수
override fun onServiceStateChanged(serviceState: ServiceState?) {
super.onServiceStateChanged(serviceState)
(... 생략 ...)
}
}
val manager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
manager.listen(phoneStateListener, PhoneStateListener.LISTEN_SERVICE_STATE)
//상수 여러개 지정
manager.listen(phoneStateListener,
PhoneStateListener.LISTEN_SERVICE_STATE or PhoneStateListener.LISTEN_CALL_STATE)
//상태 감지 해제
manager.listen(phoneStateListener, PhoneStateListener.LISTEN_NONE)
val phoneStateListener = object : PhoneStateListener() {
override fun onServiceStateChanged(serviceState: ServiceState?) {
when (serviceState?.state) {
ServiceState.STATE_EMERGENCY_ONLY -> Log.d("kkang", "긴급 통화만 가능한 상태...")
ServiceState.STATE_OUT_OF_SERVICE -> Log.d("kkang", "서비스 불가 상태...")
ServiceState.STATE_POWER_OFF -> Log.d("kkang", "전화 기능을 꺼 놓은 상태...")
ServiceState.STATE_IN_SERVICE -> Log.d("kkang", "서비스 가능 상태...")
}
}
}
onCallStateChanged() 함수 사용
→ 앱에서 전화번호 받아오기 위한 퍼미션 등록
<uses-permission android:name="android.permission.READ_CALL_LOG" />
override fun onCallStateChanged(state: Int, phoneNumber: String?) {
when (state) {
TelephonyManager.CALL_STATE_IDLE -> Log.d("kkang", "통화 대기 상태..")
TelephonyManager.CALL_STATE_RINGING -> Log.d("kkang", "벨이 울리는 상태..$phoneNumber")
TelephonyManager.CALL_STATE_OFFHOOK -> Log.d("kkang", "통화 중인 상태..$phoneNumber")
}
}
getNetworkCountryIso() : 네트워크 제공 국가
getNetworkOperatorName() : 네트워크 제공 사업자
getLine1Number() : 스마트폰의 전화번호
→ getLine1Number() 함수 이용해 스마트폰 전화번호 추출하기 위한 퍼미션 등록
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
// manager -> TelephonyManager 객체
val countryIso = manager.networkCountryIso()
val operatorName = manager.networkOperatorName()
val phoneNumber = manager.line1Number()
→ 네트워크 상태 접근 퍼미션
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
private fun isNetworkAvailable(): Boolean {
val connectivityManager = getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager
val nw = connectivityManager.activeNetwork ?: return false
val actNw = connectivityManager.getNetworkCapabilities(nw) ?: return false
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
return when {
actNw.hasTransport(NetworkCapabilities.TRANSPORT_WIFI) -> {
Log.d("kkang", "wifi available")
true
}
actNw.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR) -> {
Log.d("kkang", "cellular available")
true
}
else -> false
}
} else {
return connectivityManager.activeNetworkInfo?.isConnected ?: false
}
}
→ 퍼미션 선언
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" />
// 네트워크 타입 지정
val networkReq: NetworkRequest = NetworkRequest.Builder()
.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
.addTransportType(NetworkCapabilities.TRANSPORT_CELLULAR)
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.build()
// 네트워크 접속 가능 여부 반환
// 가능하면 onAvailable()함수 호출되고, 불가능하면 onUnavailable()함수 호출됨
connectivityManager.requestNetwork(networkReq, object : ConnectivityManager.NetworkCallback() {
override fun onAvailable(network: Network) {
super.onAvailable(network)
Log.d("kkang", "NetworkCallback...onAvailable...")
}
override fun onUnavailable() {
super.onUnavailable()
Log.d("kkang", "NetworkCallback...onUnavailable...")
}
})