선생님, 개발을 잘하고 싶어요.

안드로이드 통화 상태 감지 코드 본문

개발/android 개발

안드로이드 통화 상태 감지 코드

알고싶은 승민 2018. 11. 20. 22:23

잠금화면을 구현했는데 통화가 오는 경우에도 커스텀 잠금화면이 화면 위를 덮어서 통화가 불편했다. (잠금화면에 문제를 틀리면 일정시간 강제 잠금이라 생각보다 매우 화나더라.)




따라서 통화중인지 아닌지 여부를 판단하여 통화가 온 상태라면 잠금화면을 띄우지 않도록 구현하였다.


1. 전화상태를 체크하기 위해서 READ_PHONE_STATE 권한 필요

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


2. 전화상태를 읽는 리스너 등록

1
2
3
4
5
6
7
8
9
10
11
private var mIsPhoneIdle = true
private val phoneListener = object : PhoneStateListener() {
    override fun onCallStateChanged(state: Int, incomingNumber: String) {
        when (state) {
            TelephonyManager.CALL_STATE_IDLE -> mIsPhoneIdle = true
            TelephonyManager.CALL_STATE_RINGING -> mIsPhoneIdle = false
            TelephonyManager.CALL_STATE_OFFHOOK -> mIsPhoneIdle = false
        }
    }
}
cs


3. 전화상태가 대기 상태일때만 서비스를 켠도록 바꾼다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
override fun onReceive(context: Context, intent: Intent) {
    Log.d(TAG, "onReceive")
    if (intent.action == Intent.ACTION_SCREEN_ON) {
        // 전화 통화가 온 상태면 키면 화가 난다.
        if (mTelephonyManager == null) {
            mTelephonyManager = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        }
        mTelephonyManager?.listen(phoneListener, PhoneStateListener.LISTEN_CALL_STATE)
        if (mIsPhoneIdle) {
            // LockScreenService 를 시작해주어야 한다.
            // 이미 LockScreenService 를 띄워줄 권한은 받은 상태여야 한다.
            val intent = Intent(context, LockScreenService::class.java)
            val setting = SettingsPref.getSettings(context)
            intent.putExtra("forceLockPeriod", setting.slideForcePeriod)
            context.startService(intent)
        }
    }
}


cs


편--안 하게 전화 받을수 있게 되었다.




Comments