Android 12 メモ -PhoneStateListener Deprecated 対応

スクリーンショット 2021-09-13 9.50.32

PhoneStateListener が Deprecated になったので、Android 12 での対応をメモとして残しておく。

// Android 11 まで

val phoneStateListener = object : PhoneStateListener() {
    override fun onCallStateChanged(state: Int, incomingNumber: String?) {
        // 電話のStateが変わった時の処理をここに書く
    }
}
(getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager)?.listen(
    phoneStateListener,
    PhoneStateListener.LISTEN_CALL_STATE
)
// Android 12 から

// 電話のStateが変わった時の処理を行う function を引数で渡す
class CustomTelephonyCallback(private val func: () -> Unit) :
    TelephonyCallback(),
    TelephonyCallback.CallStateListener {
    override fun onCallStateChanged(state: Int) {
        func()
    }
}

// READ_PHONE_STATE のパーミッションが必要
private fun isReadPhoneStateGranted() =
    ActivityCompat.checkSelfPermission(
        this,
        Manifest.permission.READ_PHONE_STATE
    ) == PackageManager.PERMISSION_GRANTED

// Unregister する時のために保持しておく 
private var callback: CustomTelephonyCallback? = null

if (isReadPhoneStateGranted()) {
    (getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager)?.
        registerTelephonyCallback(
            mainExecutor,
            CustomTelephonyCallback {
                // 電話のStateが変わった時の処理
                xxx()
            }.also {
                callback = it
            }
        )
    )
}

// Unregister Callback が用意されているので、 onDestroy 等で実行する
@SuppressLint("NewApi")
override fun onDestroy() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
        callback?.let {
            (getSystemService(Context.TELEPHONY_SERVICE) as? TelephonyManager)?.
                unregisterTelephonyCallback(it)
        }
    }
    super.onDestroy()
}


このドキュメントは "Chatwork Tech Tips" の一環です。
その他の Tips も含めて @Chatwork_dev にて確認することができます 👨‍🏫

この記事が気に入ったらサポートをしてみませんか?