telephony.listen,应用关闭时 phoneStateListener 不工作

telephony.listen , phoneStateListener not working when app is closed

此 PhoneStateListener 仅在应用程序为 API>28(P) 打开时才有效,但我想要 incoming/outgoing phone 号码,即使应用程序已关闭也能正常工作在 API<=28(P)。 如果在通话时应用程序处于打开状态,我将收到 phone 号码,否则号码将显示为空白。

if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.P) {
                phnNbr = intent?.getStringExtra(TelephonyManager.EXTRA_INCOMING_NUMBER).toString()
            } else if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P && Build.VERSION.SDK_INT <= Build.VERSION_CODES.R) {
                val telephony =
                    context.getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
                telephony.listen(object : PhoneStateListener() {
                    override fun onCallStateChanged(state: Int, incomingNumber: String) {
                        super.onCallStateChanged(state, incomingNumber)
                        println("incomingNumber API>28: $incomingNumber")
                        phnNbr = incomingNumber
                    }
                }, PhoneStateListener.LISTEN_CALL_STATE)
            }

AndroidOS保护用户隐私免受恶意应用窃取用户信息是正常行为。但是,您可以通过使用 系统事件广播接收器 来解决此问题,以便收到传入 phone 呼叫的通知。 Here is a good example to follow. The example is not enough and applicable for current android API levels and you need to have a Foreground Service 接到电话后 运行 前台服务并执行您的代码。

我正在使用 onCallStateChanged,因为我从文档中了解到 getStringExtra(EXTRA_INCOMING_NUMBER) 在 SDK<= Android P 中已弃用。但令我惊讶的是,因为我有 READ_PHONE_NUMBERS & READ_CALL_LOG 权限,旧方法 getStringExtra(EXTRA_INCOMING_NUMBER) 对我有用,这也解决了操作 Sim 2 时的错误响应。只需确保处理对 BroadcastReceiver 的 fun onReceive 的多次调用。