首页 > 解决方案 > Android 检测到不成功的电话并稍后再试

问题描述

有没有办法在一段时间后重试错过或不成功的呼出电话?我正在使用ACTION_CALL意图发起电话并将其连接到 PhoneStateListener。

class PlaceCall : AppCompatActivity() {
    private fun outboundCall() {
        val telephonyManager = getSystemService(Context.TELEPHONY_SERVICE) as TelephonyManager
        telephonyManager.listen(CallListener(context), PhoneStateListener.LISTEN_CALL_STATE)
        val callIntent = Intent(Intent.ACTION_CALL, Uri.parse("tel:" + phoneNumber))
        startActivity(callIntent)
    }
}

CallListener 设置如下:

class CallListener(cont: Context) : PhoneStateListener() {
    private var context: Context = cont
    private var incoming: Boolean = false
    private var prevState: Int = TelephonyManager.CALL_STATE_IDLE

    override fun onCallStateChanged(state: Int, phoneNumber: String?) {
        val audioManager = context.getSystemService(Context.AUDIO_SERVICE) as AudioManager
        when(state) {
            TelephonyManager.CALL_STATE_RINGING -> { incoming = true }
            TelephonyManager.CALL_STATE_IDLE -> {
                if(prevState == TelephonyManager.CALL_STATE_RINGING) { //Missed call?
                }
            TelephonyManager.CALL_STATE_OFFHOOK -> { Log.d("DEBUG", "calling $phoneNumber") }
            }
        }
        prevState = state
    }
}

如果不是成功的电话呼叫连接,我如何等待确定的时间间隔并再次尝试呼叫?另外,为什么phoneNumber监听器中的值总是空的?

标签: androidkotlintelephonymanagerandroid-audiomanagerphone-state-listener

解决方案


与通过IDLE-> RINGING->的来电不同,在出站呼叫中,它总是直接从->OFFHOOK跳转,即使它正在响铃(在另一边)。IDLEOFFHOOK

因此,如果“成功”您的意思是说对方接听的电话对PhoneStateListener您没有帮助,因为对方接听时没有发送额外的状态。

另外,为什么监听器中phoneNumber的值总是空的?

phoneNumber仅为来电填充,并且仅当您的应用同时具有READ_CALL_LOGREAD_PHONE_STATE权限时,请参见此处

如果您需要最后一次呼叫号码,您可以Calls.getLastOutgoingCall在拨出呼叫结束后几秒钟使用 API。


推荐阅读