Android 12 メモ -PhoneStateListener Deprecated 対応
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 にて確認することができます 👨🏫