android - TelephonyManager 在 android 12 上弃用了 listen() CALL_STATE_RINGING

标签 android telephony telephonymanager android-12

我想听听当我的应用程序在前台时是否有电话。
以前是这样的,但现在不推荐使用 listen() :

val tm = context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
            tm.listen(object : PhoneStateListener() {
                override fun onCallStateChanged(state: Int, phoneNumber: String?) {
                    super.onCallStateChanged(state, phoneNumber)
                    when (state) {
                        TelephonyManager.CALL_STATE_RINGING -> transcribingAudioConsumer.stopTranscription(null)
                        else -> {}
                    }
                }
            }, PhoneStateListener.LISTEN_CALL_STATE)
我尝试过这样的事情,但我找不到正确的方法来实现它。
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
                        tm.registerTelephonyCallback({ it.run() }, MyPhoneStateListener())
                    }
  @RequiresApi(Build.VERSION_CODES.S)
    class MyPhoneStateListener : TelephonyCallback(), TelephonyCallback.CallStateListener {
        override fun onCallStateChanged(state: Int) {
            when (state) {
                TelephonyManager.CALL_STATE_RINGING -> {
                    Timber.e("omg RING")
                }

                TelephonyManager.CALL_STATE_OFFHOOK -> {
                    Timber.e("omg hook")
                }
                TelephonyManager.CALL_STATE_IDLE -> {
                    Timber.e("omg idle")
                }
            }
        }
    }

最佳答案

由于自 api 31 android 12 以来不推荐使用 listen 方法,因此我采用了一种简单的方法来收听电话回调。

val telephonyManager: TelephonyManager =
    context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
    telephonyManager.registerTelephonyCallback(
        context.mainExecutor,
        object : TelephonyCallback(), TelephonyCallback.CallStateListener {
            override fun onCallStateChanged(state: Int) {
            }
        })
} else {
    telephonyManager.listen(object : PhoneStateListener() {
        override fun onCallStateChanged(state: Int, phoneNumber: String?) {
        }
    }, PhoneStateListener.LISTEN_CALL_STATE)
}
请注意,新回拨不包括电话号码。
至少对于广播接收器,可以通过以下方式检索电话号码
intent.extras.getString("incoming_number")

关于android - TelephonyManager 在 android 12 上弃用了 listen() CALL_STATE_RINGING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69571012/

相关文章:

android - OnLoadFinished 无限调用

android - 如何防止登录用户返回到 Android 中的登录/注册屏幕?

communication - 当我有同一个 SIP 提供商的多个电话号码时如何路由来电?

javascript - 如何使用 Twilio 调用实时语音电话而不是在接听电话时只播放 MP3?

android - 以编程方式禁用移动网络

javascript - android上的 'SafeAreaView'相当于什么 - React Native

android - Android 中用相机拍照并将其发送到邮件

android - getNeighboringCellInfo() 返回空列表

android - 在 Android 上调用双号电话号码的快捷方式

android - 副 SIM 卡的 MNC 和 MCC